1 | /* $Id: xfs.h 93115 2022-01-01 11:31:46Z vboxsync $ */
|
---|
2 | /** @file
|
---|
3 | * IPRT, XFS format.
|
---|
4 | */
|
---|
5 |
|
---|
6 | /*
|
---|
7 | * Copyright (C) 2018-2022 Oracle Corporation
|
---|
8 | *
|
---|
9 | * This file is part of VirtualBox Open Source Edition (OSE), as
|
---|
10 | * available from http://www.virtualbox.org. This file is free software;
|
---|
11 | * you can redistribute it and/or modify it under the terms of the GNU
|
---|
12 | * General Public License (GPL) as published by the Free Software
|
---|
13 | * Foundation, in version 2 as it comes in the "COPYING" file of the
|
---|
14 | * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
|
---|
15 | * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
|
---|
16 | *
|
---|
17 | * The contents of this file may alternatively be used under the terms
|
---|
18 | * of the Common Development and Distribution License Version 1.0
|
---|
19 | * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
|
---|
20 | * VirtualBox OSE distribution, in which case the provisions of the
|
---|
21 | * CDDL are applicable instead of those of the GPL.
|
---|
22 | *
|
---|
23 | * You may elect to license modified versions of this file under the
|
---|
24 | * terms and conditions of either the GPL or the CDDL or both.
|
---|
25 | */
|
---|
26 |
|
---|
27 | #ifndef IPRT_INCLUDED_formats_xfs_h
|
---|
28 | #define IPRT_INCLUDED_formats_xfs_h
|
---|
29 | #ifndef RT_WITHOUT_PRAGMA_ONCE
|
---|
30 | # pragma once
|
---|
31 | #endif
|
---|
32 |
|
---|
33 | #include <iprt/types.h>
|
---|
34 | #include <iprt/assertcompile.h>
|
---|
35 |
|
---|
36 |
|
---|
37 | /** @defgroup grp_rt_formats_xfs XFS filesystem structures and definitions
|
---|
38 | * @ingroup grp_rt_formats
|
---|
39 | * @{
|
---|
40 | */
|
---|
41 |
|
---|
42 | /*
|
---|
43 | * The filesystem structures were retrieved from:
|
---|
44 | * http://xfs.org/docs/xfsdocs-xml-dev/XFS_Filesystem_Structure//tmp/en-US/html/index.html and
|
---|
45 | * https://elixir.bootlin.com/linux/v4.9/source/fs/xfs/libxfs/xfs_format.h and
|
---|
46 | * https://righteousit.wordpress.com/
|
---|
47 | */
|
---|
48 |
|
---|
49 | /** XFS superblock offset from the beginning of the volume, this is constant. */
|
---|
50 | #define XFS_SB_OFFSET UINT64_C(0)
|
---|
51 |
|
---|
52 | /** @name Common XFS types as defined in the spec.
|
---|
53 | * @{ */
|
---|
54 | /** Unsigned 64 bit absolute inode number. */
|
---|
55 | typedef uint64_t XFSINO;
|
---|
56 | /** Signed 64 bit file offset. */
|
---|
57 | typedef int64_t XFSFOFF;
|
---|
58 | /** Signed 64 bit disk address. */
|
---|
59 | typedef int64_t XFSDADDR;
|
---|
60 | /** Unsinged 32 bit allocation group (AG) number. */
|
---|
61 | typedef uint32_t XFSAGNUMBER;
|
---|
62 | /** Unsigned 32 bit AG relative block number. */
|
---|
63 | typedef uint32_t XFSAGBLOCK;
|
---|
64 | /** Unsigned 32 bit extent length in blocks. */
|
---|
65 | typedef uint32_t XFSEXTLEN;
|
---|
66 | /** Signed 32 bit number of extents in a file. */
|
---|
67 | typedef int32_t XFSEXTNUM;
|
---|
68 | /** Unsigned 32 bit block number for directories and extended attributes. */
|
---|
69 | typedef uint32_t XFSDABLK;
|
---|
70 | /** Unsigned 32 bit hash of a directory file name or extended attribute name. */
|
---|
71 | typedef uint32_t XFSDAHASH;
|
---|
72 | /** Unsigned 64 bit filesystem block number combining AG number and block offset into the AG. */
|
---|
73 | typedef uint64_t XFSDFSBNO;
|
---|
74 | /** Unsigned 64 bit raw filesystem block number. */
|
---|
75 | typedef uint64_t XFSDRFSBNO;
|
---|
76 | /** Unsigned 64 bit extent number in the real-time device. */
|
---|
77 | typedef uint64_t XFSDRTBNO;
|
---|
78 | /** Unsigned 64 bit block offset int oa file. */
|
---|
79 | typedef uint64_t XFSDFILOFF;
|
---|
80 | /** Unsigned 64 bit block count for a file. */
|
---|
81 | typedef uint64_t XFSDFILBLKS;
|
---|
82 | /** @} */
|
---|
83 |
|
---|
84 | /**
|
---|
85 | * XFS superblock.
|
---|
86 | */
|
---|
87 | #pragma pack(1)
|
---|
88 | typedef struct XFSSUPERBLOCK
|
---|
89 | {
|
---|
90 | /** 0x00: Magic number to identify the superblock. */
|
---|
91 | uint32_t u32Magic;
|
---|
92 | /** 0x04: Size of smallest allocation unit in bytes. */
|
---|
93 | uint32_t cbBlock;
|
---|
94 | /** 0x04: Number of blocks available for data and metadata. */
|
---|
95 | XFSDRFSBNO cBlocks;
|
---|
96 | /** 0x0c: Number of block in the real-time device. */
|
---|
97 | XFSDRFSBNO cBlocksRtDev;
|
---|
98 | /** 0x14: Number of extents on real-time device. */
|
---|
99 | XFSDRTBNO cExtentsRtDev;
|
---|
100 | /** 0x1c: UUID of the filesystem. */
|
---|
101 | uint8_t abUuid[16];
|
---|
102 | /** 0x2c: First block of the filesystem journal. */
|
---|
103 | XFSDFSBNO uBlockJournal;
|
---|
104 | /** 0x34: Inode number of the root directory. */
|
---|
105 | XFSINO uInodeRoot;
|
---|
106 | /** Inode for the real-time extent bitmap. */
|
---|
107 | XFSINO uInodeBitmapRtExt;
|
---|
108 | /** Inode for the real-time bitmap summary. */
|
---|
109 | XFSINO uInodeBitmapSummary;
|
---|
110 | /** Extent size on the real-time device in blocks. */
|
---|
111 | XFSAGBLOCK cRtExtent;
|
---|
112 | /** Size of an AG in blocks. */
|
---|
113 | XFSAGBLOCK cAgBlocks;
|
---|
114 | /** Number of AGs in hte filesystem. */
|
---|
115 | XFSAGNUMBER cAg;
|
---|
116 | /** Number of real-time bitmap blocks. */
|
---|
117 | XFSEXTLEN cRtBitmapBlocks;
|
---|
118 | /** Number of blocks for the journal. */
|
---|
119 | XFSEXTLEN cJournalBlocks;
|
---|
120 | /** Version number (actually flag bitmaps of features). */
|
---|
121 | uint16_t fVersion;
|
---|
122 | /** Sector size of the underlying medium. */
|
---|
123 | uint16_t cbSector;
|
---|
124 | /** Size of an inode in bytes. */
|
---|
125 | uint16_t cbInode;
|
---|
126 | /** Number of inodes stored in one block. */
|
---|
127 | uint16_t cInodesPerBlock;
|
---|
128 | /** Name of the filesystem. */
|
---|
129 | char achFsName[12];
|
---|
130 | /** Block size as log2 (number of bits to shift left). */
|
---|
131 | uint8_t cBlockSzLog;
|
---|
132 | /** Sector size as log2 (number of bits to shift left). */
|
---|
133 | uint8_t cSectorSzLog;
|
---|
134 | /** Inode size as log2 (number of bits to shift left). */
|
---|
135 | uint8_t cInodeSzLog;
|
---|
136 | /** Number of inodes per block as log2. */
|
---|
137 | uint8_t cInodesPerBlockLog;
|
---|
138 | /** Number of AG blocks as log2 (number of bits to shift left). */
|
---|
139 | uint8_t cAgBlocksLog;
|
---|
140 | /** Number of extent blocks as log2. */
|
---|
141 | uint8_t cExtentsRtDevLog;
|
---|
142 | /** Flag when the filesystem is in the process of being created. */
|
---|
143 | uint8_t fInProgress;
|
---|
144 | /** Maximum percentage of the filesystem usable for inodes. */
|
---|
145 | uint8_t cInodeMaxPct;
|
---|
146 | /** Global number of inodes allocated (only mainted on the first superblock). */
|
---|
147 | uint64_t cInodesGlobal;
|
---|
148 | /** Global number of free inodes (only mainted on the first superblock). */
|
---|
149 | uint64_t cInodesGlobalFree;
|
---|
150 | /** Global count of free data blocks on the filesystem (only mainted on the first superblock). */
|
---|
151 | uint64_t cBlocksFree;
|
---|
152 | /** Global count of free extents on the real-time device (only mainted on the first superblock). */
|
---|
153 | uint64_t cExtentsRtFree;
|
---|
154 | /** Inode containing the user quotas. */
|
---|
155 | XFSINO uInodeQuotaUsr;
|
---|
156 | /** Inode containing the group/project quotas. */
|
---|
157 | XFSINO uInodeQuotaGrp;
|
---|
158 | /** Quota flags. */
|
---|
159 | uint16_t fQuotaFlags;
|
---|
160 | /** Misc flags. */
|
---|
161 | uint8_t fFlagsMisc;
|
---|
162 | /** Reserved MBZ. */
|
---|
163 | uint8_t uSharedVn;
|
---|
164 | /** Number of filesystem blocks for the inode chunk alignment. */
|
---|
165 | XFSEXTLEN cBlocksInodeAlignment;
|
---|
166 | /** Raid stripe size in blocks. */
|
---|
167 | uint32_t cBlocksRaidStripe;
|
---|
168 | /** Raid width in number of blocks. */
|
---|
169 | uint32_t cBlocksRaidWidth;
|
---|
170 | /** Multiplier for determining the allocation size for directory blocks as log2. */
|
---|
171 | uint8_t cDirBlockAllocLog;
|
---|
172 | /** Sub volume sector size as log2 if an external journal device is used. */
|
---|
173 | uint8_t cLogDevSubVolSectorSzLog;
|
---|
174 | /** Sector size of the device an external journal is stored as log2. */
|
---|
175 | uint16_t cLogDevSectorSzLog;
|
---|
176 | /** Log devices stripe size. */
|
---|
177 | uint32_t cLogDevRaidStripe;
|
---|
178 | /** Additional features which may be active. */
|
---|
179 | uint32_t fFeatures2;
|
---|
180 | /** Padding. */
|
---|
181 | uint32_t u32Padding0;
|
---|
182 | /** From here follow data only available from version 5 and later. */
|
---|
183 | /** Read/Write feature flags. */
|
---|
184 | uint32_t fFeaturesRw;
|
---|
185 | /** Read-only feature flags. */
|
---|
186 | uint32_t fFeaturesRo;
|
---|
187 | /** Read/Write incompatible feature flags. */
|
---|
188 | uint32_t fFeaturesIncompatRw;
|
---|
189 | /** Read/Write incompatible feature flags for the journal. */
|
---|
190 | uint32_t fFeaturesJrnlIncompatRw;
|
---|
191 | /** CRC32 checksum for the superblock. */
|
---|
192 | uint32_t u32Chksum;
|
---|
193 | /** Sparse inode alignment. */
|
---|
194 | uint32_t u32SparseInodeAlignment;
|
---|
195 | /** Project quota inode. */
|
---|
196 | XFSINO uInodeProjectQuota;
|
---|
197 | /** Log sequence number of last superblock update. */
|
---|
198 | uint64_t uJrnlSeqSbUpdate;
|
---|
199 | /** UUID used when INCOMPAT_META_UUID is used. */
|
---|
200 | uint8_t abUuidMeta[16];
|
---|
201 | /** Inode if INCOMPATMETA_RMAPBT is used. */
|
---|
202 | XFSINO uInodeRm;
|
---|
203 | } XFSSUPERBLOCK;
|
---|
204 | #pragma pack()
|
---|
205 | AssertCompileSize(XFSSUPERBLOCK, 272);
|
---|
206 | /** Pointer to an XFS superblock. */
|
---|
207 | typedef XFSSUPERBLOCK *PXFSSUPERBLOCK;
|
---|
208 | /** Pointer to a const XFS superblock. */
|
---|
209 | typedef const XFSSUPERBLOCK *PCXFSSUPERBLOCK;
|
---|
210 |
|
---|
211 | /** XFS superblock magic. */
|
---|
212 | #define XFS_SB_MAGIC RT_MAKE_U32_FROM_U8('B', 'S', 'F', 'X')
|
---|
213 |
|
---|
214 | /** @name XFS_SB_VERSION_F_XXX - Version/Feature flags.
|
---|
215 | * @{ */
|
---|
216 | /** Retrieves the version part of the field. */
|
---|
217 | #define XFS_SB_VERSION_GET(a_fVersion) ((a_fVersion) & 0xf)
|
---|
218 | /** Version number for filesystem 5.3, 6.0.1 and 6.1. */
|
---|
219 | #define XFS_SB_VERSION_1 1
|
---|
220 | /** Version number for filesystem 6.2 - attributes. */
|
---|
221 | #define XFS_SB_VERSION_2 2
|
---|
222 | /** Version number for filesystem 6.2 - new inode version. */
|
---|
223 | #define XFS_SB_VERSION_3 3
|
---|
224 | /** Version number for filesystem 6.2+ - new bitmask version. */
|
---|
225 | #define XFS_SB_VERSION_4 4
|
---|
226 | /** Introduced checksums in the metadata. */
|
---|
227 | #define XFS_SB_VERSION_5 5
|
---|
228 | /** Extended attributes are used for at least one inode. */
|
---|
229 | #define XFS_SB_VERSION_F_ATTR RT_BIT_32(4)
|
---|
230 | /** At least one inode use 32-bit nlink values. */
|
---|
231 | #define XFS_SB_VERSION_F_NLINK RT_BIT_32(5)
|
---|
232 | /** Quotas are enabled on the filesystem. */
|
---|
233 | #define XFS_SB_VERSION_F_QUOTA RT_BIT_32(6)
|
---|
234 | /** Set if XFSSUPERBLOCK::cBlocksInodeAlignment is used. */
|
---|
235 | #define XFS_SB_VERSION_F_ALIGN RT_BIT_32(7)
|
---|
236 | /** Set if XFSSUPERBLOCK::cBlocksRaidStripe and XFSSUPERBLOCK::cBlocksRaidWidth are used. */
|
---|
237 | #define XFS_SB_VERSION_F_DALIGN RT_BIT_32(8)
|
---|
238 | /** Set if XFSSUPERBLOCK::uSharedVn is used. */
|
---|
239 | #define XFS_SB_VERSION_F_SHARED RT_BIT_32(9)
|
---|
240 | /** Version 2 journaling is used. */
|
---|
241 | #define XFS_SB_VERSION_F_LOGV2 RT_BIT_32(10)
|
---|
242 | /** Set if sector size is not 512 bytes. */
|
---|
243 | #define XFS_SB_VERSION_F_SECTOR RT_BIT_32(11)
|
---|
244 | /** Set if unwritten extents are used (always set). */
|
---|
245 | #define XFS_SB_VERSION_F_EXTFLG RT_BIT_32(12)
|
---|
246 | /** Version 2 directories are used (always set). */
|
---|
247 | #define XFS_SB_VERSION_F_DIRV2 RT_BIT_32(13)
|
---|
248 | /** Set if XFSSUPERBLOCK::fFeatures2 is used. */
|
---|
249 | #define XFS_SB_VERSION_F_FEAT2 RT_BIT_32(14)
|
---|
250 | /** @} */
|
---|
251 |
|
---|
252 | /** @name XFS_SB_QUOTA_F_XXX - Quota flags
|
---|
253 | * @{ */
|
---|
254 | /** User quota accounting enabled. */
|
---|
255 | #define XFS_SB_QUOTA_F_USR_ACCT RT_BIT(0)
|
---|
256 | /** User quotas are enforced. */
|
---|
257 | #define XFS_SB_QUOTA_F_USR_ENFD RT_BIT(1)
|
---|
258 | /** User quotas have been checked and updated on disk. */
|
---|
259 | #define XFS_SB_QUOTA_F_USR_CHKD RT_BIT(2)
|
---|
260 | /** Project quota accounting is enabled. */
|
---|
261 | #define XFS_SB_QUOTA_F_PROJ_ACCT RT_BIT(3)
|
---|
262 | /** Other quotas are enforced. */
|
---|
263 | #define XFS_SB_QUOTA_F_OTH_ENFD RT_BIT(4)
|
---|
264 | /** Other quotas have been checked and updated on disk. */
|
---|
265 | #define XFS_SB_QUOTA_F_OTH_CHKD RT_BIT(5)
|
---|
266 | /** Group quota accounting enabled. */
|
---|
267 | #define XFS_SB_QUOTA_F_GRP_ACCT RT_BIT(6)
|
---|
268 | /** @} */
|
---|
269 |
|
---|
270 | /** @name XFS_SB_FEATURES2_F_XXX - Additional features
|
---|
271 | * @{ */
|
---|
272 | /** Global counters are lazy and are only updated when the filesystem is cleanly unmounted. */
|
---|
273 | #define XFS_SB_FEATURES2_F_LAZYSBCOUNT RT_BIT_32(1)
|
---|
274 | /** Extended attributes version 2. */
|
---|
275 | #define XFS_SB_FEATURES2_F_ATTR2 RT_BIT_32(3)
|
---|
276 | /** Parent pointers, inodes must have an extended attribute pointing to the parent inode. */
|
---|
277 | #define XFS_SB_FEATURES2_F_PARENT RT_BIT_32(4)
|
---|
278 | /** @} */
|
---|
279 |
|
---|
280 |
|
---|
281 | /**
|
---|
282 | * XFS AG free space block.
|
---|
283 | */
|
---|
284 | typedef struct XFSAGF
|
---|
285 | {
|
---|
286 | /** Magic number. */
|
---|
287 | uint32_t u32Magic;
|
---|
288 | /** Header version number. */
|
---|
289 | uint32_t uVersion;
|
---|
290 | /** AG number for the sector. */
|
---|
291 | uint32_t uSeqNo;
|
---|
292 | /** Length of the AG in filesystem blocks. */
|
---|
293 | uint32_t cLengthBlocks;
|
---|
294 | /** Block numbers for the roots of the free space B+trees. */
|
---|
295 | uint32_t auRoots[3];
|
---|
296 | /** Depths of the free space B+trees. */
|
---|
297 | uint32_t acLvls[3];
|
---|
298 | /** Index of the first free list block. */
|
---|
299 | uint32_t idxFreeListFirst;
|
---|
300 | /** Index of the last free list block. */
|
---|
301 | uint32_t idxFreeListLast;
|
---|
302 | /** Number of blocks in the free list. */
|
---|
303 | uint32_t cFreeListBlocks;
|
---|
304 | /** Current number of free blocks in the AG. */
|
---|
305 | uint32_t cFreeBlocks;
|
---|
306 | /** Longest number of contiguous free blocks in the AG. */
|
---|
307 | uint32_t cFreeBlocksLongest;
|
---|
308 | /** Number of blocks used for the free space B+-trees. */
|
---|
309 | uint32_t cBlocksBTrees;
|
---|
310 | /** UUID of filesystem the AG belongs to. */
|
---|
311 | uint8_t abUuid[16];
|
---|
312 | /** Number of blocks used for the reverse map. */
|
---|
313 | uint32_t cBlocksRevMap;
|
---|
314 | /** Number of blocks used for the refcount B+-tree. */
|
---|
315 | uint32_t cBlocksRefcountBTree;
|
---|
316 | /** Block number for the refcount tree root. */
|
---|
317 | uint32_t uRootRefcount;
|
---|
318 | /** Depth of the refcount B+-tree. */
|
---|
319 | uint32_t cLvlRefcount;
|
---|
320 | /** Reserved contiguous space for future extensions. */
|
---|
321 | uint64_t au64Rsvd[14];
|
---|
322 | /** Last write sequence number. */
|
---|
323 | uint64_t uSeqNoLastWrite;
|
---|
324 | /** CRC of the AGF. */
|
---|
325 | uint32_t uChkSum;
|
---|
326 | /** Padding to 64 bit alignment. */
|
---|
327 | uint32_t uAlignment0;
|
---|
328 | } XFSAGF;
|
---|
329 | /** Pointer to a AG free space block. */
|
---|
330 | typedef XFSAGF *PXFSAGF;
|
---|
331 | /** Poiner to a const AG free space block. */
|
---|
332 | typedef const XFSAGF *PCXFSAGF;
|
---|
333 |
|
---|
334 | /** AGF magic. */
|
---|
335 | #define XFS_AGF_MAGIC RT_MAKE_U32_FROM_U8('F', 'G', 'A', 'X')
|
---|
336 | /** The current valid AGF version. */
|
---|
337 | #define XFS_AGF_VERSION 1
|
---|
338 |
|
---|
339 |
|
---|
340 | /**
|
---|
341 | * XFS AG inode information.
|
---|
342 | */
|
---|
343 | typedef struct XFSAGI
|
---|
344 | {
|
---|
345 | /** Magic number. */
|
---|
346 | uint32_t u32Magic;
|
---|
347 | /** Header version number. */
|
---|
348 | uint32_t uVersion;
|
---|
349 | /** AG number for the sector. */
|
---|
350 | uint32_t uSeqNo;
|
---|
351 | /** Length of the AG in filesystem blocks. */
|
---|
352 | uint32_t cLengthBlocks;
|
---|
353 | /** Count of allocated inodes. */
|
---|
354 | uint32_t cInodesAlloc;
|
---|
355 | /** Block number of the inode tree root. */
|
---|
356 | uint32_t uRootInode;
|
---|
357 | /** Depth of the inode B+-tree. */
|
---|
358 | uint32_t cLvlsInode;
|
---|
359 | /** Newest allocated inode. */
|
---|
360 | uint32_t uInodeNew;
|
---|
361 | /** Last directory inode chunk. */
|
---|
362 | uint32_t uInodeDir;
|
---|
363 | /** Hash table of unlinked but still referenced inodes. */
|
---|
364 | uint32_t au32HashUnlinked[64];
|
---|
365 | /** UUID of filesystem. */
|
---|
366 | uint8_t abUuid[16];
|
---|
367 | /** CRC of the AGI. */
|
---|
368 | uint32_t uChkSum;
|
---|
369 | /** Padding. */
|
---|
370 | uint32_t uAlignment0;
|
---|
371 | /** Last write sequence number. */
|
---|
372 | uint64_t uSeqNoLastWrite;
|
---|
373 | /** Block number of the free inode tree. */
|
---|
374 | uint32_t uRootFreeInode;
|
---|
375 | /** Depth of the free inode B+-tree. */
|
---|
376 | uint32_t cLvlsFreeInode;
|
---|
377 | } XFSAGI;
|
---|
378 | /** Pointer to a AG inode information. */
|
---|
379 | typedef XFSAGI *PXFSAGI;
|
---|
380 | /** Pointer to a const AG inode information. */
|
---|
381 | typedef const XFSAGI *PCXFSAGI;
|
---|
382 |
|
---|
383 | /** AGI magic. */
|
---|
384 | #define XFS_AGI_MAGIC RT_MAKE_U32_FROM_U8('I', 'G', 'A', 'X')
|
---|
385 | /** The current valid AGI version. */
|
---|
386 | #define XFS_AGI_VERSION 1
|
---|
387 |
|
---|
388 |
|
---|
389 | /**
|
---|
390 | * XFS timestamp structure.
|
---|
391 | */
|
---|
392 | typedef struct XFSTIMESTAMP
|
---|
393 | {
|
---|
394 | /** 0x00: The second part of the timestamp since the epoch. */
|
---|
395 | int32_t cSecEpoch;
|
---|
396 | /** 0x04: Nanosecond part of the timestamp. */
|
---|
397 | int32_t cNanoSec;
|
---|
398 | } XFSTIMESTAMP;
|
---|
399 | /** Pointer to a XFS timestamp. */
|
---|
400 | typedef XFSTIMESTAMP *PXFSTIMESTAMP;
|
---|
401 | /** Poiner to a const CFS timestamp. */
|
---|
402 | typedef const XFSTIMESTAMP *PCXFSTIMESTAMP;
|
---|
403 |
|
---|
404 |
|
---|
405 | /**
|
---|
406 | * The inode core structure.
|
---|
407 | */
|
---|
408 | typedef struct XFSINODECORE
|
---|
409 | {
|
---|
410 | /** 0x00: Magic value. */
|
---|
411 | uint16_t u16Magic;
|
---|
412 | /** 0x02: File mode and access bits (XFS_INODE_MODE_XXX). */
|
---|
413 | uint16_t fMode;
|
---|
414 | /** 0x04: Inode version. */
|
---|
415 | int8_t iVersion;
|
---|
416 | /** 0x05: The format of the data fork. */
|
---|
417 | int8_t enmFormat;
|
---|
418 | /** 0x06: Number of links to this inode from directories for v1 inodes. */
|
---|
419 | uint16_t cOnLinks;
|
---|
420 | /** 0x08: Owners UID. */
|
---|
421 | uint32_t uUid;
|
---|
422 | /** 0x0c: Owners GID. */
|
---|
423 | uint32_t uGid;
|
---|
424 | /** 0x10: The number of links to this inode for v2 inodes. */
|
---|
425 | uint32_t cLinks;
|
---|
426 | /** 0x14: Project ID for v2 inodes (not used for v1, low 16bits). */
|
---|
427 | uint16_t uProjIdLow;
|
---|
428 | /** 0x16: Project ID for v2 inodes (not used for v1, high 16bits). */
|
---|
429 | uint16_t uProjIdHigh;
|
---|
430 | /** 0x18: Padding. */
|
---|
431 | uint8_t abPad0[6];
|
---|
432 | /** 0x1e: Flush counter. */
|
---|
433 | uint16_t cFlush;
|
---|
434 | /** 0x20: Last accessed timestamp. */
|
---|
435 | XFSTIMESTAMP TsLastAccessed;
|
---|
436 | /** 0x28: Last modified timestamp. */
|
---|
437 | XFSTIMESTAMP TsLastModified;
|
---|
438 | /** 0x30: Inode created/modified timestamp. */
|
---|
439 | XFSTIMESTAMP TsCreatedModified;
|
---|
440 | /** 0x38: Number of bytes in the file. */
|
---|
441 | uint64_t cbInode;
|
---|
442 | /** 0x40: Number of direct and B-Tree blocks used for the forks. */
|
---|
443 | uint64_t cBlocks;
|
---|
444 | /** 0x48: Minimum extent size for the inode. */
|
---|
445 | uint32_t cExtentBlocksMin;
|
---|
446 | /** 0x4c: Number of extents in the data fork. */
|
---|
447 | uint32_t cExtentsData;
|
---|
448 | /** 0x50: Number of extents in the attribute fork. */
|
---|
449 | uint16_t cExtentsAttr;
|
---|
450 | /** 0x52: Offset of the attribute fork from the start of the inode. */
|
---|
451 | uint8_t offAttrFork;
|
---|
452 | /** 0x53: Attribute fork format. */
|
---|
453 | int8_t enmFormatAttr;
|
---|
454 | /** 0x54: DMIG event mask. */
|
---|
455 | uint32_t fEvtMaskDmig;
|
---|
456 | /** 0x58: DMIG state info. */
|
---|
457 | uint16_t uStateDmig;
|
---|
458 | /** 0x5a: Inode flags. */
|
---|
459 | uint16_t fFlags;
|
---|
460 | /** 0x5c: Generation number. */
|
---|
461 | uint32_t cGeneration;
|
---|
462 | /** 0x60: AGI unlinked list pointer. */
|
---|
463 | uint32_t offBlockUnlinkedNext;
|
---|
464 | /** The following fields are for v3 inodes only. */
|
---|
465 | /** 0x64: The CRC of the inode. */
|
---|
466 | uint32_t uChkSum;
|
---|
467 | /** 0x68: Number of attribute changes. */
|
---|
468 | uint64_t cAttrChanges;
|
---|
469 | /** 0x70: Last flush sequence number. */
|
---|
470 | uint64_t uFlushSeqNo;
|
---|
471 | /** 0x78: Additional flags. */
|
---|
472 | uint64_t fFlags2;
|
---|
473 | /** 0x80: Basic COW extent size. */
|
---|
474 | uint32_t cExtentCowMin;
|
---|
475 | /** 0x84: Padding for future expansion. */
|
---|
476 | uint8_t abPad1[12];
|
---|
477 | /** 0x90: Inode creation timestamp. */
|
---|
478 | XFSTIMESTAMP TsCreation;
|
---|
479 | /** 0x98: The inode number. */
|
---|
480 | uint64_t uInode;
|
---|
481 | /** 0x100: Filesystem UUID the inode belongs to. */
|
---|
482 | uint8_t abUuid[16];
|
---|
483 | } XFSINODECORE;
|
---|
484 | AssertCompileSizeAlignment(XFSINODECORE, 8);
|
---|
485 | /** Pointer to a inode core. */
|
---|
486 | typedef XFSINODECORE *PXFSINODECORE;
|
---|
487 | /** Pointer to a const inode core. */
|
---|
488 | typedef const XFSINODECORE *PCXFSINODECORE;
|
---|
489 |
|
---|
490 | /** Inode magic. */
|
---|
491 | #define XFS_INODE_MAGIC RT_MAKE_U16_FROM_U8('N', 'I')
|
---|
492 |
|
---|
493 | /** @name XFS_INODE_MODE_XXX - File mode
|
---|
494 | * @{ */
|
---|
495 | /** Others can execute the file. */
|
---|
496 | #define XFS_INODE_MODE_EXEC_OTHER RT_BIT(0)
|
---|
497 | /** Others can write to the file. */
|
---|
498 | #define XFS_INODE_MODE_WRITE_OTHER RT_BIT(1)
|
---|
499 | /** Others can read the file. */
|
---|
500 | #define XFS_INODE_MODE_READ_OTHER RT_BIT(2)
|
---|
501 | /** Members of the same group can execute the file. */
|
---|
502 | #define XFS_INODE_MODE_EXEC_GROUP RT_BIT(3)
|
---|
503 | /** Members of the same group can write to the file. */
|
---|
504 | #define XFS_INODE_MODE_WRITE_GROUP RT_BIT(4)
|
---|
505 | /** Members of the same group can read the file. */
|
---|
506 | #define XFS_INODE_MODE_READ_GROUP RT_BIT(5)
|
---|
507 | /** Owner can execute the file. */
|
---|
508 | #define XFS_INODE_MODE_EXEC_OWNER RT_BIT(6)
|
---|
509 | /** Owner can write to the file. */
|
---|
510 | #define XFS_INODE_MODE_WRITE_OWNER RT_BIT(7)
|
---|
511 | /** Owner can read the file. */
|
---|
512 | #define XFS_INODE_MODE_READ_OWNER RT_BIT(8)
|
---|
513 | /** Sticky file mode. */
|
---|
514 | #define XFS_INODE_MODE_STICKY RT_BIT(9)
|
---|
515 | /** File is set GID. */
|
---|
516 | #define XFS_INODE_MODE_SET_GROUP_ID RT_BIT(10)
|
---|
517 | /** File is set UID. */
|
---|
518 | #define XFS_INODE_MODE_SET_USER_ID RT_BIT(11)
|
---|
519 | /** @} */
|
---|
520 |
|
---|
521 | /** @name XFS_INODE_MODE_TYPE_XXX - File type
|
---|
522 | * @{ */
|
---|
523 | /** Inode represents a FIFO. */
|
---|
524 | #define XFS_INODE_MODE_TYPE_FIFO UINT16_C(0x1000)
|
---|
525 | /** Inode represents a character device. */
|
---|
526 | #define XFS_INODE_MODE_TYPE_CHAR UINT16_C(0x2000)
|
---|
527 | /** Inode represents a directory. */
|
---|
528 | #define XFS_INODE_MODE_TYPE_DIR UINT16_C(0x4000)
|
---|
529 | /** Inode represents a block device. */
|
---|
530 | #define XFS_INODE_MODE_TYPE_BLOCK UINT16_C(0x6000)
|
---|
531 | /** Inode represents a regular file. */
|
---|
532 | #define XFS_INODE_MODE_TYPE_REGULAR UINT16_C(0x8000)
|
---|
533 | /** Inode represents a symlink. */
|
---|
534 | #define XFS_INODE_MODE_TYPE_SYMLINK UINT16_C(0xa000)
|
---|
535 | /** Inode represents a socket. */
|
---|
536 | #define XFS_INODE_MODE_TYPE_SOCKET UINT16_C(0xc000)
|
---|
537 | /** Returns the inode type from the combined mode field. */
|
---|
538 | #define XFS_INODE_MODE_TYPE_GET_TYPE(a_Mode) ((a_Mode) & 0xf000)
|
---|
539 | /** @} */
|
---|
540 |
|
---|
541 | /** @name XFS_INODE_FORMAT_XXX - Inode data fork format.
|
---|
542 | * @{ */
|
---|
543 | /** Device node data. */
|
---|
544 | #define XFS_INODE_FORMAT_DEV 0
|
---|
545 | /** Inline data. */
|
---|
546 | #define XFS_INODE_FORMAT_LOCAL 1
|
---|
547 | /** Array of extent descriptors. */
|
---|
548 | #define XFS_INODE_FORMAT_EXTENTS 2
|
---|
549 | /** Data fork contains root of B-Tree. */
|
---|
550 | #define XFS_INODE_FORMAT_BTREE 3
|
---|
551 | /** Data fork contains UUID. */
|
---|
552 | #define XFS_INODE_FORMAT_UUID 4
|
---|
553 | /** @} */
|
---|
554 |
|
---|
555 | /** @name XFS_INODE_F_XXX - Inode flags.
|
---|
556 | * @{ */
|
---|
557 | /** File data blocks are stored in the real-time device area. */
|
---|
558 | #define XFS_INODE_F_RTDEV RT_BIT(0)
|
---|
559 | /** File space has been pre-allocated. */
|
---|
560 | #define XFS_INODE_F_PREALLOC RT_BIT(1)
|
---|
561 | /** Use new real-time bitmap format. */
|
---|
562 | #define XFS_INODE_F_NEWRTBITMAP RT_BIT(2)
|
---|
563 | /** Inode is immutable. */
|
---|
564 | #define XFS_INODE_F_IMMUTABLE RT_BIT(3)
|
---|
565 | /** Inode is append only. */
|
---|
566 | #define XFS_INODE_F_APPEND RT_BIT(4)
|
---|
567 | /** Inode is written synchronously. */
|
---|
568 | #define XFS_INODE_F_SYNC RT_BIT(5)
|
---|
569 | /** The last accessed timestamp is not updated. */
|
---|
570 | #define XFS_INODE_F_NOATIME RT_BIT(6)
|
---|
571 | /** The inode is not dumpable via dump(1). */
|
---|
572 | #define XFS_INODE_F_NODUMP RT_BIT(7)
|
---|
573 | /** Create with real-time bit set. */
|
---|
574 | #define XFS_INODE_F_RTINHERIT RT_BIT(8)
|
---|
575 | /** Create with parents project ID. */
|
---|
576 | #define XFS_INODE_F_PROJIDINHERIT RT_BIT(9)
|
---|
577 | /** Deny symlink creation. */
|
---|
578 | #define XFS_INODE_F_NOSYMLINKS RT_BIT(10)
|
---|
579 | /** Inode extent size allocator hint. */
|
---|
580 | #define XFS_INODE_F_EXTSIZEHINT RT_BIT(11)
|
---|
581 | /** Inode extent size is inherited. */
|
---|
582 | #define XFS_INODE_F_EXTSIZEINHERIT RT_BIT(12)
|
---|
583 | /** Do not defrag/reorganize the inode. */
|
---|
584 | #define XFS_INODE_F_NODEFRAG RT_BIT(13)
|
---|
585 | /** Use filestream allocator. */
|
---|
586 | #define XFS_INODE_F_FILESTREAM RT_BIT(14)
|
---|
587 | /** @} */
|
---|
588 |
|
---|
589 | /** @name XFS_INODE_F2_XXX - Inode flags number 2 (XFSINODECORE::fFlags2).
|
---|
590 | * @{ */
|
---|
591 | /** Use DAX for the inode. */
|
---|
592 | #define XFS_INODE_F2_DAX RT_BIT_64(0)
|
---|
593 | /** Blocks use reference counting for sharing. */
|
---|
594 | #define XFS_INODE_F2_REFLINK RT_BIT_64(1)
|
---|
595 | /** Inode COW extent size hint is valid. */
|
---|
596 | #define XFS_INODE_F2_COWEXTSIZEHINT RT_BIT_64(2)
|
---|
597 | /** @} */
|
---|
598 |
|
---|
599 |
|
---|
600 | /**
|
---|
601 | * Inode B-Tree record.
|
---|
602 | */
|
---|
603 | typedef struct XFSINODEBTREEREC
|
---|
604 | {
|
---|
605 | /** 0x00: Starting inode number. */
|
---|
606 | uint32_t uInodeStart;
|
---|
607 | /** 0x04: Version dependent data. */
|
---|
608 | union
|
---|
609 | {
|
---|
610 | /** Full (old) version. */
|
---|
611 | struct
|
---|
612 | {
|
---|
613 | /** 0x04: Number of free inodes. */
|
---|
614 | uint32_t cInodesFree;
|
---|
615 | } Full;
|
---|
616 | /** Sparse (new) version. */
|
---|
617 | struct
|
---|
618 | {
|
---|
619 | /** 0x04: Hole mask for sparse chunks. */
|
---|
620 | uint16_t bmHoles;
|
---|
621 | /** 0x06: Total number of inodes. */
|
---|
622 | uint8_t cInodes;
|
---|
623 | /** 0x07: Number of free inodes. */
|
---|
624 | uint8_t cInodesFree;
|
---|
625 | } Sparse;
|
---|
626 | } u;
|
---|
627 | /** 0x08: Free inode mask. */
|
---|
628 | uint64_t bmInodesFree;
|
---|
629 | } XFSINODEBTREEREC;
|
---|
630 | /** Pointer to an inode B-Tree record. */
|
---|
631 | typedef XFSINODEBTREEREC *PXFSINODEBTREEREC;
|
---|
632 | /** Pointer to a const inode B-Tree record. */
|
---|
633 | typedef const XFSINODEBTREEREC *PCXFSINODEBTREEREC;
|
---|
634 |
|
---|
635 |
|
---|
636 | /**
|
---|
637 | * XFS B+Tree root header.
|
---|
638 | */
|
---|
639 | typedef struct XFSBTREEROOTHDR
|
---|
640 | {
|
---|
641 | /** 0x00: Tree level. */
|
---|
642 | uint16_t iLvl;
|
---|
643 | /** 0x02: Number of records. */
|
---|
644 | uint16_t cRecs;
|
---|
645 | } XFSBTREEROOTHDR;
|
---|
646 | /** Pointer to a B+Tree root header */
|
---|
647 | typedef XFSBTREEROOTHDR *PXFSBTREEROOTHDR;
|
---|
648 | /** Pointer to a const B+Tree root header. */
|
---|
649 | typedef const XFSBTREEROOTHDR *PCXFSBTREEROOTHDR;
|
---|
650 |
|
---|
651 |
|
---|
652 | /**
|
---|
653 | * XFS B+Tree intermediate/leave node header.
|
---|
654 | */
|
---|
655 | typedef struct XFSBTREENODEHDR
|
---|
656 | {
|
---|
657 | /** 0x00: Magic identifying the node. */
|
---|
658 | uint32_t u32Magic;
|
---|
659 | /** 0x04: Tree level. */
|
---|
660 | uint16_t iLvl;
|
---|
661 | /** 0x06: Number of records. */
|
---|
662 | uint16_t cRecs;
|
---|
663 | /** 0x08: Block number of the left sibling. */
|
---|
664 | uint64_t uSibLeft;
|
---|
665 | /** 0x10: Block number of the right sibling. */
|
---|
666 | uint64_t uSibRight;
|
---|
667 | } XFSBTREENODEHDR;
|
---|
668 | /** Pointer to a B+Tree intermediate/leave node header. */
|
---|
669 | typedef XFSBTREENODEHDR *PXFSBTREENODEHDR;
|
---|
670 | /** Pointer to a const B+Tree intermediate/leave node header. */
|
---|
671 | typedef const XFSBTREENODEHDR *PCXFSBTREENODEHDR;
|
---|
672 |
|
---|
673 | /** @name XFS_BTREENODEHDR_XXX - B+Tree node related defines.
|
---|
674 | * @{ */
|
---|
675 | /** Magic for the tree node header. */
|
---|
676 | #define XFS_BTREENODEHDR_MAGIC RT_MAKE_U32_FROM_U8('P', 'A', 'M', 'B')
|
---|
677 | /** @} */
|
---|
678 |
|
---|
679 |
|
---|
680 | /**
|
---|
681 | * XFS Extent.
|
---|
682 | */
|
---|
683 | typedef struct XFSEXTENT
|
---|
684 | {
|
---|
685 | /** 0x00: Low 64 bits. */
|
---|
686 | uint64_t u64Low;
|
---|
687 | /** 0x08: High 64 bits. */
|
---|
688 | uint64_t u64High;
|
---|
689 | } XFSEXTENT;
|
---|
690 | /** Pointer to an XFS extent. */
|
---|
691 | typedef XFSEXTENT *PXFSEXTENT;
|
---|
692 | /** Pointer to a const XFS extent. */
|
---|
693 | typedef const XFSEXTENT *PCXFSEXTENT;
|
---|
694 |
|
---|
695 | /** @name XFS_EXTENT_XXX - Extent related getters.
|
---|
696 | * @{ */
|
---|
697 | /** Returns whether the extent is allocated but unwritten (true) or a normal extent (false). */
|
---|
698 | #define XFS_EXTENT_IS_UNWRITTEN(a_pExtent) (RT_BOOL((a_pExtent)->u64High & RT_BIT_64(63)))
|
---|
699 | /** Returns the number of blocks the extent covers. */
|
---|
700 | #define XFS_EXTENT_GET_BLOCK_COUNT(a_pExtent) ((a_pExtent)->u64Low & UINT64_C(0x1fffff))
|
---|
701 | /** Returns the absolute block number where the data is stored on the disk. */
|
---|
702 | #define XFS_EXTENT_GET_DISK_BLOCK(a_pExtent) ( (((a_pExtent)->u64High & UINT64_C(0x1ff)) << 42) \
|
---|
703 | | (((a_pExtent)->u64Low & UINT64_C(0xffffffffffe00000)) >> 21))
|
---|
704 | /** Returns the logical inode block offset. */
|
---|
705 | #define XFS_EXTENT_GET_LOGICAL_BLOCK(a_pExtent) (((a_pExtent)->u64High & UINT64_C(0x7ffffffffffffe00)) >> 9)
|
---|
706 | /** @} */
|
---|
707 |
|
---|
708 | /** @} */
|
---|
709 |
|
---|
710 | #endif /* !IPRT_INCLUDED_formats_xfs_h */
|
---|
711 |
|
---|