LCOV - code coverage report
Current view: top level - fs/xfs/libxfs - xfs_format.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc4-xfsa @ Mon Jul 31 20:08:27 PDT 2023 Lines: 36 39 92.3 %
Date: 2023-07-31 20:08:27 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : /*
       3             :  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
       4             :  * All Rights Reserved.
       5             :  */
       6             : #ifndef __XFS_FORMAT_H__
       7             : #define __XFS_FORMAT_H__
       8             : 
       9             : /*
      10             :  * XFS On Disk Format Definitions
      11             :  *
      12             :  * This header file defines all the on-disk format definitions for
      13             :  * general XFS objects. Directory and attribute related objects are defined in
      14             :  * xfs_da_format.h, which log and log item formats are defined in
      15             :  * xfs_log_format.h. Everything else goes here.
      16             :  */
      17             : 
      18             : struct xfs_mount;
      19             : struct xfs_trans;
      20             : struct xfs_inode;
      21             : struct xfs_buf;
      22             : struct xfs_ifork;
      23             : 
      24             : /*
      25             :  * Super block
      26             :  * Fits into a sector-sized buffer at address 0 of each allocation group.
      27             :  * Only the first of these is ever updated except during growfs.
      28             :  */
      29             : #define XFS_SB_MAGIC            0x58465342      /* 'XFSB' */
      30             : #define XFS_SB_VERSION_1        1               /* 5.3, 6.0.1, 6.1 */
      31             : #define XFS_SB_VERSION_2        2               /* 6.2 - attributes */
      32             : #define XFS_SB_VERSION_3        3               /* 6.2 - new inode version */
      33             : #define XFS_SB_VERSION_4        4               /* 6.2+ - bitmask version */
      34             : #define XFS_SB_VERSION_5        5               /* CRC enabled filesystem */
      35             : #define XFS_SB_VERSION_NUMBITS          0x000f
      36             : #define XFS_SB_VERSION_ALLFBITS         0xfff0
      37             : #define XFS_SB_VERSION_ATTRBIT          0x0010
      38             : #define XFS_SB_VERSION_NLINKBIT         0x0020
      39             : #define XFS_SB_VERSION_QUOTABIT         0x0040
      40             : #define XFS_SB_VERSION_ALIGNBIT         0x0080
      41             : #define XFS_SB_VERSION_DALIGNBIT        0x0100
      42             : #define XFS_SB_VERSION_SHAREDBIT        0x0200
      43             : #define XFS_SB_VERSION_LOGV2BIT         0x0400
      44             : #define XFS_SB_VERSION_SECTORBIT        0x0800
      45             : #define XFS_SB_VERSION_EXTFLGBIT        0x1000
      46             : #define XFS_SB_VERSION_DIRV2BIT         0x2000
      47             : #define XFS_SB_VERSION_BORGBIT          0x4000  /* ASCII only case-insens. */
      48             : #define XFS_SB_VERSION_MOREBITSBIT      0x8000
      49             : 
      50             : /*
      51             :  * The size of a single extended attribute on disk is limited by
      52             :  * the size of index values within the attribute entries themselves.
      53             :  * These are be16 fields, so we can only support attribute data
      54             :  * sizes up to 2^16 bytes in length.
      55             :  */
      56             : #define XFS_XATTR_SIZE_MAX (1 << 16)
      57             : 
      58             : /*
      59             :  * Supported feature bit list is just all bits in the versionnum field because
      60             :  * we've used them all up and understand them all. Except, of course, for the
      61             :  * shared superblock bit, which nobody knows what it does and so is unsupported.
      62             :  */
      63             : #define XFS_SB_VERSION_OKBITS           \
      64             :         ((XFS_SB_VERSION_NUMBITS | XFS_SB_VERSION_ALLFBITS) & \
      65             :                 ~XFS_SB_VERSION_SHAREDBIT)
      66             : 
      67             : /*
      68             :  * There are two words to hold XFS "feature" bits: the original
      69             :  * word, sb_versionnum, and sb_features2.  Whenever a bit is set in
      70             :  * sb_features2, the feature bit XFS_SB_VERSION_MOREBITSBIT must be set.
      71             :  *
      72             :  * These defines represent bits in sb_features2.
      73             :  */
      74             : #define XFS_SB_VERSION2_RESERVED1BIT    0x00000001
      75             : #define XFS_SB_VERSION2_LAZYSBCOUNTBIT  0x00000002      /* Superblk counters */
      76             : #define XFS_SB_VERSION2_RESERVED4BIT    0x00000004
      77             : #define XFS_SB_VERSION2_ATTR2BIT        0x00000008      /* Inline attr rework */
      78             : #define XFS_SB_VERSION2_PARENTBIT       0x00000010      /* parent pointers */
      79             : #define XFS_SB_VERSION2_PROJID32BIT     0x00000080      /* 32 bit project id */
      80             : #define XFS_SB_VERSION2_CRCBIT          0x00000100      /* metadata CRCs */
      81             : #define XFS_SB_VERSION2_FTYPE           0x00000200      /* inode type in dir */
      82             : 
      83             : #define XFS_SB_VERSION2_OKBITS          \
      84             :         (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \
      85             :          XFS_SB_VERSION2_ATTR2BIT       | \
      86             :          XFS_SB_VERSION2_PROJID32BIT    | \
      87             :          XFS_SB_VERSION2_FTYPE)
      88             : 
      89             : /* Maximum size of the xfs filesystem label, no terminating NULL */
      90             : #define XFSLABEL_MAX                    12
      91             : 
      92             : /*
      93             :  * Superblock - in core version.  Must be padded to 64 bit alignment.
      94             :  */
      95             : typedef struct xfs_sb {
      96             :         uint32_t        sb_magicnum;    /* magic number == XFS_SB_MAGIC */
      97             :         uint32_t        sb_blocksize;   /* logical block size, bytes */
      98             :         xfs_rfsblock_t  sb_dblocks;     /* number of data blocks */
      99             :         xfs_rfsblock_t  sb_rblocks;     /* number of realtime blocks */
     100             :         xfs_rtbxlen_t   sb_rextents;    /* number of realtime extents */
     101             :         uuid_t          sb_uuid;        /* user-visible file system unique id */
     102             :         xfs_fsblock_t   sb_logstart;    /* starting block of log if internal */
     103             :         xfs_ino_t       sb_rootino;     /* root inode number */
     104             :         xfs_ino_t       sb_rbmino;      /* bitmap inode for realtime extents */
     105             :         xfs_ino_t       sb_rsumino;     /* summary inode for rt bitmap */
     106             :         xfs_agblock_t   sb_rextsize;    /* realtime extent size, blocks */
     107             :         xfs_agblock_t   sb_agblocks;    /* size of an allocation group */
     108             :         xfs_agnumber_t  sb_agcount;     /* number of allocation groups */
     109             :         xfs_extlen_t    sb_rbmblocks;   /* number of rt bitmap blocks */
     110             :         xfs_extlen_t    sb_logblocks;   /* number of log blocks */
     111             :         uint16_t        sb_versionnum;  /* header version == XFS_SB_VERSION */
     112             :         uint16_t        sb_sectsize;    /* volume sector size, bytes */
     113             :         uint16_t        sb_inodesize;   /* inode size, bytes */
     114             :         uint16_t        sb_inopblock;   /* inodes per block */
     115             :         char            sb_fname[XFSLABEL_MAX]; /* file system name */
     116             :         uint8_t         sb_blocklog;    /* log2 of sb_blocksize */
     117             :         uint8_t         sb_sectlog;     /* log2 of sb_sectsize */
     118             :         uint8_t         sb_inodelog;    /* log2 of sb_inodesize */
     119             :         uint8_t         sb_inopblog;    /* log2 of sb_inopblock */
     120             :         uint8_t         sb_agblklog;    /* log2 of sb_agblocks (rounded up) */
     121             :         uint8_t         sb_rextslog;    /* log2 of sb_rextents */
     122             :         uint8_t         sb_inprogress;  /* mkfs is in progress, don't mount */
     123             :         uint8_t         sb_imax_pct;    /* max % of fs for inode space */
     124             :                                         /* statistics */
     125             :         /*
     126             :          * These fields must remain contiguous.  If you really
     127             :          * want to change their layout, make sure you fix the
     128             :          * code in xfs_trans_apply_sb_deltas().
     129             :          */
     130             :         uint64_t        sb_icount;      /* allocated inodes */
     131             :         uint64_t        sb_ifree;       /* free inodes */
     132             :         uint64_t        sb_fdblocks;    /* free data blocks */
     133             :         uint64_t        sb_frextents;   /* free realtime extents */
     134             :         /*
     135             :          * End contiguous fields.
     136             :          */
     137             :         xfs_ino_t       sb_uquotino;    /* user quota inode */
     138             :         xfs_ino_t       sb_gquotino;    /* group quota inode */
     139             :         uint16_t        sb_qflags;      /* quota flags */
     140             :         uint8_t         sb_flags;       /* misc. flags */
     141             :         uint8_t         sb_shared_vn;   /* shared version number */
     142             :         xfs_extlen_t    sb_inoalignmt;  /* inode chunk alignment, fsblocks */
     143             :         uint32_t        sb_unit;        /* stripe or raid unit */
     144             :         uint32_t        sb_width;       /* stripe or raid width */
     145             :         uint8_t         sb_dirblklog;   /* log2 of dir block size (fsbs) */
     146             :         uint8_t         sb_logsectlog;  /* log2 of the log sector size */
     147             :         uint16_t        sb_logsectsize; /* sector size for the log, bytes */
     148             :         uint32_t        sb_logsunit;    /* stripe unit size for the log */
     149             :         uint32_t        sb_features2;   /* additional feature bits */
     150             : 
     151             :         /*
     152             :          * bad features2 field as a result of failing to pad the sb structure to
     153             :          * 64 bits. Some machines will be using this field for features2 bits.
     154             :          * Easiest just to mark it bad and not use it for anything else.
     155             :          *
     156             :          * This is not kept up to date in memory; it is always overwritten by
     157             :          * the value in sb_features2 when formatting the incore superblock to
     158             :          * the disk buffer.
     159             :          */
     160             :         uint32_t        sb_bad_features2;
     161             : 
     162             :         /* version 5 superblock fields start here */
     163             : 
     164             :         /* feature masks */
     165             :         uint32_t        sb_features_compat;
     166             :         uint32_t        sb_features_ro_compat;
     167             :         uint32_t        sb_features_incompat;
     168             :         uint32_t        sb_features_log_incompat;
     169             : 
     170             :         uint32_t        sb_crc;         /* superblock crc */
     171             :         xfs_extlen_t    sb_spino_align; /* sparse inode chunk alignment */
     172             : 
     173             :         xfs_ino_t       sb_pquotino;    /* project quota inode */
     174             :         xfs_lsn_t       sb_lsn;         /* last write sequence */
     175             :         uuid_t          sb_meta_uuid;   /* metadata file system unique id */
     176             : 
     177             :         /* Fields beyond here do not match xfs_dsb.  Be very careful! */
     178             : 
     179             :         /*
     180             :          * Metadata Directory Inode.  On disk this lives in the sb_rbmino slot,
     181             :          * but we continue to use the in-core superblock to cache the classic
     182             :          * inodes (rt bitmap; rt summary; user, group, and project quotas) so
     183             :          * we cache the metadir inode value here too.
     184             :          */
     185             :         xfs_ino_t       sb_metadirino;
     186             : 
     187             :         /*
     188             :          * Realtime group geometry information.  On disk these fields live in
     189             :          * the rsumino slot, but we cache them separately in the in-core super
     190             :          * for easy access.
     191             :          */
     192             :         xfs_rgblock_t   sb_rgblocks;    /* size of a realtime group */
     193             :         xfs_rgnumber_t  sb_rgcount;     /* number of realtime groups */
     194             : 
     195             :         /* must be padded to 64 bit alignment */
     196             : } xfs_sb_t;
     197             : 
     198             : /*
     199             :  * Superblock - on disk version.
     200             :  * Must be padded to 64 bit alignment.
     201             :  */
     202             : struct xfs_dsb {
     203             :         __be32          sb_magicnum;    /* magic number == XFS_SB_MAGIC */
     204             :         __be32          sb_blocksize;   /* logical block size, bytes */
     205             :         __be64          sb_dblocks;     /* number of data blocks */
     206             :         __be64          sb_rblocks;     /* number of realtime blocks */
     207             :         __be64          sb_rextents;    /* number of realtime extents */
     208             :         uuid_t          sb_uuid;        /* user-visible file system unique id */
     209             :         __be64          sb_logstart;    /* starting block of log if internal */
     210             :         __be64          sb_rootino;     /* root inode number */
     211             :         /*
     212             :          * bitmap inode for realtime extents.
     213             :          *
     214             :          * The metadata directory feature uses the sb_rbmino field to point to
     215             :          * the root of the metadata directory tree.  All other sb inode
     216             :          * pointers are no longer used.
     217             :          */
     218             :         __be64          sb_rbmino;
     219             :         /*
     220             :          * rtgroups requires metadir, so we reuse the rsumino space to hold
     221             :          * the rg block count and shift values.
     222             :          */
     223             :         union {
     224             :                 __be64  sb_rsumino;     /* summary inode for rt bitmap */
     225             :                 struct {
     226             :                         __be32  sb_rgcount;     /* # of realtime groups */
     227             :                         __be32  sb_rgblocks;    /* rtblocks per group */
     228             :                 };
     229             :         };
     230             :         __be32          sb_rextsize;    /* realtime extent size, blocks */
     231             :         __be32          sb_agblocks;    /* size of an allocation group */
     232             :         __be32          sb_agcount;     /* number of allocation groups */
     233             :         __be32          sb_rbmblocks;   /* number of rt bitmap blocks */
     234             :         __be32          sb_logblocks;   /* number of log blocks */
     235             :         __be16          sb_versionnum;  /* header version == XFS_SB_VERSION */
     236             :         __be16          sb_sectsize;    /* volume sector size, bytes */
     237             :         __be16          sb_inodesize;   /* inode size, bytes */
     238             :         __be16          sb_inopblock;   /* inodes per block */
     239             :         char            sb_fname[XFSLABEL_MAX]; /* file system name */
     240             :         __u8            sb_blocklog;    /* log2 of sb_blocksize */
     241             :         __u8            sb_sectlog;     /* log2 of sb_sectsize */
     242             :         __u8            sb_inodelog;    /* log2 of sb_inodesize */
     243             :         __u8            sb_inopblog;    /* log2 of sb_inopblock */
     244             :         __u8            sb_agblklog;    /* log2 of sb_agblocks (rounded up) */
     245             :         __u8            sb_rextslog;    /* log2 of sb_rextents */
     246             :         __u8            sb_inprogress;  /* mkfs is in progress, don't mount */
     247             :         __u8            sb_imax_pct;    /* max % of fs for inode space */
     248             :                                         /* statistics */
     249             :         /*
     250             :          * These fields must remain contiguous.  If you really
     251             :          * want to change their layout, make sure you fix the
     252             :          * code in xfs_trans_apply_sb_deltas().
     253             :          */
     254             :         __be64          sb_icount;      /* allocated inodes */
     255             :         __be64          sb_ifree;       /* free inodes */
     256             :         __be64          sb_fdblocks;    /* free data blocks */
     257             :         __be64          sb_frextents;   /* free realtime extents */
     258             :         /*
     259             :          * End contiguous fields.
     260             :          */
     261             :         __be64          sb_uquotino;    /* user quota inode */
     262             :         __be64          sb_gquotino;    /* group quota inode */
     263             :         __be16          sb_qflags;      /* quota flags */
     264             :         __u8            sb_flags;       /* misc. flags */
     265             :         __u8            sb_shared_vn;   /* shared version number */
     266             :         __be32          sb_inoalignmt;  /* inode chunk alignment, fsblocks */
     267             :         __be32          sb_unit;        /* stripe or raid unit */
     268             :         __be32          sb_width;       /* stripe or raid width */
     269             :         __u8            sb_dirblklog;   /* log2 of dir block size (fsbs) */
     270             :         __u8            sb_logsectlog;  /* log2 of the log sector size */
     271             :         __be16          sb_logsectsize; /* sector size for the log, bytes */
     272             :         __be32          sb_logsunit;    /* stripe unit size for the log */
     273             :         __be32          sb_features2;   /* additional feature bits */
     274             :         /*
     275             :          * bad features2 field as a result of failing to pad the sb
     276             :          * structure to 64 bits. Some machines will be using this field
     277             :          * for features2 bits. Easiest just to mark it bad and not use
     278             :          * it for anything else.
     279             :          */
     280             :         __be32          sb_bad_features2;
     281             : 
     282             :         /* version 5 superblock fields start here */
     283             : 
     284             :         /* feature masks */
     285             :         __be32          sb_features_compat;
     286             :         __be32          sb_features_ro_compat;
     287             :         __be32          sb_features_incompat;
     288             :         __be32          sb_features_log_incompat;
     289             : 
     290             :         __le32          sb_crc;         /* superblock crc */
     291             :         __be32          sb_spino_align; /* sparse inode chunk alignment */
     292             : 
     293             :         __be64          sb_pquotino;    /* project quota inode */
     294             :         __be64          sb_lsn;         /* last write sequence */
     295             :         uuid_t          sb_meta_uuid;   /* metadata file system unique id */
     296             : 
     297             :         /* must be padded to 64 bit alignment */
     298             : };
     299             : 
     300             : #define XFS_SB_CRC_OFF          offsetof(struct xfs_dsb, sb_crc)
     301             : 
     302             : /*
     303             :  * Misc. Flags - warning - these will be cleared by xfs_repair unless
     304             :  * a feature bit is set when the flag is used.
     305             :  */
     306             : #define XFS_SBF_NOFLAGS         0x00    /* no flags set */
     307             : #define XFS_SBF_READONLY        0x01    /* only read-only mounts allowed */
     308             : 
     309             : /*
     310             :  * define max. shared version we can interoperate with
     311             :  */
     312             : #define XFS_SB_MAX_SHARED_VN    0
     313             : 
     314             : #define XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS)
     315             : 
     316             : static inline bool xfs_sb_is_v5(struct xfs_sb *sbp)
     317             : {
     318   143949552 :         return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5;
     319             : }
     320             : 
     321             : /*
     322             :  * Detect a mismatched features2 field.  Older kernels read/wrote
     323             :  * this into the wrong slot, so to be safe we keep them in sync.
     324             :  */
     325             : static inline bool xfs_sb_has_mismatched_features2(struct xfs_sb *sbp)
     326             : {
     327       24343 :         return sbp->sb_bad_features2 != sbp->sb_features2;
     328             : }
     329             : 
     330             : static inline bool xfs_sb_version_hasmorebits(struct xfs_sb *sbp)
     331             : {
     332      423832 :         return xfs_sb_is_v5(sbp) ||
     333             :                (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT);
     334             : }
     335             : 
     336             : static inline void xfs_sb_version_addattr(struct xfs_sb *sbp)
     337             : {
     338           0 :         sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT;
     339             : }
     340             : 
     341             : static inline void xfs_sb_version_addquota(struct xfs_sb *sbp)
     342             : {
     343        2925 :         sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT;
     344             : }
     345             : 
     346             : static inline void xfs_sb_version_addattr2(struct xfs_sb *sbp)
     347             : {
     348           0 :         sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT;
     349           0 :         sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT;
     350             : }
     351             : 
     352             : static inline void xfs_sb_version_addprojid32(struct xfs_sb *sbp)
     353             : {
     354             :         sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT;
     355             :         sbp->sb_features2 |= XFS_SB_VERSION2_PROJID32BIT;
     356             : }
     357             : 
     358             : /*
     359             :  * Extended v5 superblock feature masks. These are to be used for new v5
     360             :  * superblock features only.
     361             :  *
     362             :  * Compat features are new features that old kernels will not notice or affect
     363             :  * and so can mount read-write without issues.
     364             :  *
     365             :  * RO-Compat (read only) are features that old kernels can read but will break
     366             :  * if they write. Hence only read-only mounts of such filesystems are allowed on
     367             :  * kernels that don't support the feature bit.
     368             :  *
     369             :  * InCompat features are features which old kernels will not understand and so
     370             :  * must not mount.
     371             :  *
     372             :  * Log-InCompat features are for changes to log formats or new transactions that
     373             :  * can't be replayed on older kernels. The fields are set when the filesystem is
     374             :  * mounted, and a clean unmount clears the fields.
     375             :  */
     376             : #define XFS_SB_FEAT_COMPAT_ALL 0
     377             : #define XFS_SB_FEAT_COMPAT_UNKNOWN      ~XFS_SB_FEAT_COMPAT_ALL
     378             : static inline bool
     379             : xfs_sb_has_compat_feature(
     380             :         struct xfs_sb   *sbp,
     381             :         uint32_t        feature)
     382             : {
     383      506864 :         return (sbp->sb_features_compat & feature) != 0;
     384             : }
     385             : 
     386             : #define XFS_SB_FEAT_RO_COMPAT_FINOBT   (1 << 0)           /* free inode btree */
     387             : #define XFS_SB_FEAT_RO_COMPAT_RMAPBT   (1 << 1)           /* reverse map btree */
     388             : #define XFS_SB_FEAT_RO_COMPAT_REFLINK  (1 << 2)           /* reflinked files */
     389             : #define XFS_SB_FEAT_RO_COMPAT_INOBTCNT (1 << 3)           /* inobt block counts */
     390             : #define XFS_SB_FEAT_RO_COMPAT_ALL \
     391             :                 (XFS_SB_FEAT_RO_COMPAT_FINOBT | \
     392             :                  XFS_SB_FEAT_RO_COMPAT_RMAPBT | \
     393             :                  XFS_SB_FEAT_RO_COMPAT_REFLINK| \
     394             :                  XFS_SB_FEAT_RO_COMPAT_INOBTCNT)
     395             : #define XFS_SB_FEAT_RO_COMPAT_UNKNOWN   ~XFS_SB_FEAT_RO_COMPAT_ALL
     396             : static inline bool
     397             : xfs_sb_has_ro_compat_feature(
     398             :         struct xfs_sb   *sbp,
     399             :         uint32_t        feature)
     400             : {
     401      507094 :         return (sbp->sb_features_ro_compat & feature) != 0;
     402             : }
     403             : 
     404             : #define XFS_SB_FEAT_INCOMPAT_FTYPE      (1 << 0)  /* filetype in dirent */
     405             : #define XFS_SB_FEAT_INCOMPAT_SPINODES   (1 << 1)  /* sparse inode chunks */
     406             : #define XFS_SB_FEAT_INCOMPAT_META_UUID  (1 << 2)  /* metadata UUID */
     407             : #define XFS_SB_FEAT_INCOMPAT_BIGTIME    (1 << 3)  /* large timestamps */
     408             : #define XFS_SB_FEAT_INCOMPAT_NEEDSREPAIR (1 << 4) /* needs xfs_repair */
     409             : #define XFS_SB_FEAT_INCOMPAT_NREXT64    (1 << 5)  /* large extent counters */
     410             : #define XFS_SB_FEAT_INCOMPAT_PARENT     (1 << 6)  /* parent pointers */
     411             : #define XFS_SB_FEAT_INCOMPAT_RTGROUPS   (1U << 30)        /* realtime groups */
     412             : #define XFS_SB_FEAT_INCOMPAT_METADIR    (1U << 31)        /* metadata dir tree */
     413             : #define XFS_SB_FEAT_INCOMPAT_ALL \
     414             :                 (XFS_SB_FEAT_INCOMPAT_FTYPE|    \
     415             :                  XFS_SB_FEAT_INCOMPAT_SPINODES| \
     416             :                  XFS_SB_FEAT_INCOMPAT_META_UUID| \
     417             :                  XFS_SB_FEAT_INCOMPAT_BIGTIME| \
     418             :                  XFS_SB_FEAT_INCOMPAT_NEEDSREPAIR| \
     419             :                  XFS_SB_FEAT_INCOMPAT_NREXT64| \
     420             :                  XFS_SB_FEAT_INCOMPAT_PARENT | \
     421             :                  XFS_SB_FEAT_INCOMPAT_RTGROUPS | \
     422             :                  XFS_SB_FEAT_INCOMPAT_METADIR)
     423             : 
     424             : #define XFS_SB_FEAT_INCOMPAT_UNKNOWN    ~XFS_SB_FEAT_INCOMPAT_ALL
     425             : static inline bool
     426             : xfs_sb_has_incompat_feature(
     427             :         struct xfs_sb   *sbp,
     428             :         uint32_t        feature)
     429             : {
     430      506856 :         return (sbp->sb_features_incompat & feature) != 0;
     431             : }
     432             : 
     433             : #define XFS_SB_FEAT_INCOMPAT_LOG_XATTRS   (1 << 0)        /* Delayed Attributes */
     434             : #define XFS_SB_FEAT_INCOMPAT_LOG_SWAPEXT  (1U << 31)      /* file extent swap */
     435             : #define XFS_SB_FEAT_INCOMPAT_LOG_ALL \
     436             :                 (XFS_SB_FEAT_INCOMPAT_LOG_XATTRS | \
     437             :                  XFS_SB_FEAT_INCOMPAT_LOG_SWAPEXT)
     438             : #define XFS_SB_FEAT_INCOMPAT_LOG_UNKNOWN        ~XFS_SB_FEAT_INCOMPAT_LOG_ALL
     439             : static inline bool
     440             : xfs_sb_has_incompat_log_feature(
     441             :         struct xfs_sb   *sbp,
     442             :         uint32_t        feature)
     443             : {
     444      567356 :         return (sbp->sb_features_log_incompat & feature) != 0;
     445             : }
     446             : 
     447             : static inline void
     448             : xfs_sb_remove_incompat_log_features(
     449             :         struct xfs_sb   *sbp,
     450             :         uint32_t        feature)
     451             : {
     452       60239 :         sbp->sb_features_log_incompat &= ~feature;
     453             : }
     454             : 
     455             : static inline void
     456             : xfs_sb_add_incompat_log_features(
     457             :         struct xfs_sb   *sbp,
     458             :         unsigned int    features)
     459             : {
     460       69626 :         sbp->sb_features_log_incompat |= features;
     461             : }
     462             : 
     463             : static inline bool xfs_sb_version_haslogxattrs(struct xfs_sb *sbp)
     464             : {
     465   139645714 :         return xfs_sb_is_v5(sbp) && (sbp->sb_features_log_incompat &
     466             :                  XFS_SB_FEAT_INCOMPAT_LOG_XATTRS);
     467             : }
     468             : 
     469             : static inline bool xfs_sb_version_haslogswapext(struct xfs_sb *sbp)
     470             : {
     471      690997 :         return xfs_sb_is_v5(sbp) && (sbp->sb_features_log_incompat &
     472             :                  XFS_SB_FEAT_INCOMPAT_LOG_SWAPEXT);
     473             : }
     474             : 
     475             : static inline bool
     476             : xfs_is_quota_inode(struct xfs_sb *sbp, xfs_ino_t ino)
     477             : {
     478  3061474502 :         return (ino == sbp->sb_uquotino ||
     479  3059618845 :                 ino == sbp->sb_gquotino ||
     480  1527951381 :                 ino == sbp->sb_pquotino);
     481             : }
     482             : 
     483             : #define XFS_SB_DADDR            ((xfs_daddr_t)0) /* daddr in filesystem/ag */
     484             : #define XFS_SB_BLOCK(mp)        XFS_HDR_BLOCK(mp, XFS_SB_DADDR)
     485             : 
     486             : #define XFS_HDR_BLOCK(mp,d)     ((xfs_agblock_t)XFS_BB_TO_FSBT(mp,d))
     487             : #define XFS_DADDR_TO_FSB(mp,d)  XFS_AGB_TO_FSB(mp, \
     488             :                         xfs_daddr_to_agno(mp,d), xfs_daddr_to_agbno(mp,d))
     489             : #define XFS_FSB_TO_DADDR(mp,fsbno)      XFS_AGB_TO_DADDR(mp, \
     490             :                         XFS_FSB_TO_AGNO(mp,fsbno), XFS_FSB_TO_AGBNO(mp,fsbno))
     491             : 
     492             : /*
     493             :  * File system sector to basic block conversions.
     494             :  */
     495             : #define XFS_FSS_TO_BB(mp,sec)   ((sec) << (mp)->m_sectbb_log)
     496             : 
     497             : /*
     498             :  * File system block to basic block conversions.
     499             :  */
     500             : #define XFS_FSB_TO_BB(mp,fsbno) ((fsbno) << (mp)->m_blkbb_log)
     501             : #define XFS_BB_TO_FSB(mp,bb)    \
     502             :         (((bb) + (XFS_FSB_TO_BB(mp,1) - 1)) >> (mp)->m_blkbb_log)
     503             : #define XFS_BB_TO_FSBT(mp,bb)   ((bb) >> (mp)->m_blkbb_log)
     504             : 
     505             : /*
     506             :  * File system block to byte conversions.
     507             :  */
     508             : #define XFS_FSB_TO_B(mp,fsbno)  ((xfs_fsize_t)(fsbno) << (mp)->m_sb.sb_blocklog)
     509             : #define XFS_B_TO_FSB(mp,b)      \
     510             :         ((((uint64_t)(b)) + (mp)->m_blockmask) >> (mp)->m_sb.sb_blocklog)
     511             : #define XFS_B_TO_FSBT(mp,b)     (((uint64_t)(b)) >> (mp)->m_sb.sb_blocklog)
     512             : 
     513             : /*
     514             :  * Allocation group header
     515             :  *
     516             :  * This is divided into three structures, placed in sequential 512-byte
     517             :  * buffers after a copy of the superblock (also in a 512-byte buffer).
     518             :  */
     519             : #define XFS_AGF_MAGIC   0x58414746      /* 'XAGF' */
     520             : #define XFS_AGI_MAGIC   0x58414749      /* 'XAGI' */
     521             : #define XFS_AGFL_MAGIC  0x5841464c      /* 'XAFL' */
     522             : #define XFS_AGF_VERSION 1
     523             : #define XFS_AGI_VERSION 1
     524             : 
     525             : #define XFS_AGF_GOOD_VERSION(v) ((v) == XFS_AGF_VERSION)
     526             : #define XFS_AGI_GOOD_VERSION(v) ((v) == XFS_AGI_VERSION)
     527             : 
     528             : /*
     529             :  * Btree number 0 is bno, 1 is cnt, 2 is rmap. This value gives the size of the
     530             :  * arrays below.
     531             :  */
     532             : #define XFS_BTNUM_AGF   ((int)XFS_BTNUM_RMAPi + 1)
     533             : 
     534             : /*
     535             :  * The second word of agf_levels in the first a.g. overlaps the EFS
     536             :  * superblock's magic number.  Since the magic numbers valid for EFS
     537             :  * are > 64k, our value cannot be confused for an EFS superblock's.
     538             :  */
     539             : 
     540             : typedef struct xfs_agf {
     541             :         /*
     542             :          * Common allocation group header information
     543             :          */
     544             :         __be32          agf_magicnum;   /* magic number == XFS_AGF_MAGIC */
     545             :         __be32          agf_versionnum; /* header version == XFS_AGF_VERSION */
     546             :         __be32          agf_seqno;      /* sequence # starting from 0 */
     547             :         __be32          agf_length;     /* size in blocks of a.g. */
     548             :         /*
     549             :          * Freespace and rmap information
     550             :          */
     551             :         __be32          agf_roots[XFS_BTNUM_AGF];       /* root blocks */
     552             :         __be32          agf_levels[XFS_BTNUM_AGF];      /* btree levels */
     553             : 
     554             :         __be32          agf_flfirst;    /* first freelist block's index */
     555             :         __be32          agf_fllast;     /* last freelist block's index */
     556             :         __be32          agf_flcount;    /* count of blocks in freelist */
     557             :         __be32          agf_freeblks;   /* total free blocks */
     558             : 
     559             :         __be32          agf_longest;    /* longest free space */
     560             :         __be32          agf_btreeblks;  /* # of blocks held in AGF btrees */
     561             :         uuid_t          agf_uuid;       /* uuid of filesystem */
     562             : 
     563             :         __be32          agf_rmap_blocks;        /* rmapbt blocks used */
     564             :         __be32          agf_refcount_blocks;    /* refcountbt blocks used */
     565             : 
     566             :         __be32          agf_refcount_root;      /* refcount tree root block */
     567             :         __be32          agf_refcount_level;     /* refcount btree levels */
     568             : 
     569             :         /*
     570             :          * reserve some contiguous space for future logged fields before we add
     571             :          * the unlogged fields. This makes the range logging via flags and
     572             :          * structure offsets much simpler.
     573             :          */
     574             :         __be64          agf_spare64[14];
     575             : 
     576             :         /* unlogged fields, written during buffer writeback. */
     577             :         __be64          agf_lsn;        /* last write sequence */
     578             :         __be32          agf_crc;        /* crc of agf sector */
     579             :         __be32          agf_spare2;
     580             : 
     581             :         /* structure must be padded to 64 bit alignment */
     582             : } xfs_agf_t;
     583             : 
     584             : #define XFS_AGF_CRC_OFF         offsetof(struct xfs_agf, agf_crc)
     585             : 
     586             : #define XFS_AGF_MAGICNUM        (1u << 0)
     587             : #define XFS_AGF_VERSIONNUM      (1u << 1)
     588             : #define XFS_AGF_SEQNO           (1u << 2)
     589             : #define XFS_AGF_LENGTH          (1u << 3)
     590             : #define XFS_AGF_ROOTS           (1u << 4)
     591             : #define XFS_AGF_LEVELS          (1u << 5)
     592             : #define XFS_AGF_FLFIRST         (1u << 6)
     593             : #define XFS_AGF_FLLAST          (1u << 7)
     594             : #define XFS_AGF_FLCOUNT         (1u << 8)
     595             : #define XFS_AGF_FREEBLKS        (1u << 9)
     596             : #define XFS_AGF_LONGEST         (1u << 10)
     597             : #define XFS_AGF_BTREEBLKS       (1u << 11)
     598             : #define XFS_AGF_UUID            (1u << 12)
     599             : #define XFS_AGF_RMAP_BLOCKS     (1u << 13)
     600             : #define XFS_AGF_REFCOUNT_BLOCKS (1u << 14)
     601             : #define XFS_AGF_REFCOUNT_ROOT   (1u << 15)
     602             : #define XFS_AGF_REFCOUNT_LEVEL  (1u << 16)
     603             : #define XFS_AGF_SPARE64         (1u << 17)
     604             : #define XFS_AGF_NUM_BITS        18
     605             : #define XFS_AGF_ALL_BITS        ((1u << XFS_AGF_NUM_BITS) - 1)
     606             : 
     607             : #define XFS_AGF_FLAGS \
     608             :         { XFS_AGF_MAGICNUM,     "MAGICNUM" }, \
     609             :         { XFS_AGF_VERSIONNUM,   "VERSIONNUM" }, \
     610             :         { XFS_AGF_SEQNO,        "SEQNO" }, \
     611             :         { XFS_AGF_LENGTH,       "LENGTH" }, \
     612             :         { XFS_AGF_ROOTS,        "ROOTS" }, \
     613             :         { XFS_AGF_LEVELS,       "LEVELS" }, \
     614             :         { XFS_AGF_FLFIRST,      "FLFIRST" }, \
     615             :         { XFS_AGF_FLLAST,       "FLLAST" }, \
     616             :         { XFS_AGF_FLCOUNT,      "FLCOUNT" }, \
     617             :         { XFS_AGF_FREEBLKS,     "FREEBLKS" }, \
     618             :         { XFS_AGF_LONGEST,      "LONGEST" }, \
     619             :         { XFS_AGF_BTREEBLKS,    "BTREEBLKS" }, \
     620             :         { XFS_AGF_UUID,         "UUID" }, \
     621             :         { XFS_AGF_RMAP_BLOCKS,  "RMAP_BLOCKS" }, \
     622             :         { XFS_AGF_REFCOUNT_BLOCKS,      "REFCOUNT_BLOCKS" }, \
     623             :         { XFS_AGF_REFCOUNT_ROOT,        "REFCOUNT_ROOT" }, \
     624             :         { XFS_AGF_REFCOUNT_LEVEL,       "REFCOUNT_LEVEL" }, \
     625             :         { XFS_AGF_SPARE64,      "SPARE64" }
     626             : 
     627             : /* disk block (xfs_daddr_t) in the AG */
     628             : #define XFS_AGF_DADDR(mp)       ((xfs_daddr_t)(1 << (mp)->m_sectbb_log))
     629             : #define XFS_AGF_BLOCK(mp)       XFS_HDR_BLOCK(mp, XFS_AGF_DADDR(mp))
     630             : 
     631             : /*
     632             :  * Size of the unlinked inode hash table in the agi.
     633             :  */
     634             : #define XFS_AGI_UNLINKED_BUCKETS        64
     635             : 
     636             : typedef struct xfs_agi {
     637             :         /*
     638             :          * Common allocation group header information
     639             :          */
     640             :         __be32          agi_magicnum;   /* magic number == XFS_AGI_MAGIC */
     641             :         __be32          agi_versionnum; /* header version == XFS_AGI_VERSION */
     642             :         __be32          agi_seqno;      /* sequence # starting from 0 */
     643             :         __be32          agi_length;     /* size in blocks of a.g. */
     644             :         /*
     645             :          * Inode information
     646             :          * Inodes are mapped by interpreting the inode number, so no
     647             :          * mapping data is needed here.
     648             :          */
     649             :         __be32          agi_count;      /* count of allocated inodes */
     650             :         __be32          agi_root;       /* root of inode btree */
     651             :         __be32          agi_level;      /* levels in inode btree */
     652             :         __be32          agi_freecount;  /* number of free inodes */
     653             : 
     654             :         __be32          agi_newino;     /* new inode just allocated */
     655             :         __be32          agi_dirino;     /* last directory inode chunk */
     656             :         /*
     657             :          * Hash table of inodes which have been unlinked but are
     658             :          * still being referenced.
     659             :          */
     660             :         __be32          agi_unlinked[XFS_AGI_UNLINKED_BUCKETS];
     661             :         /*
     662             :          * This marks the end of logging region 1 and start of logging region 2.
     663             :          */
     664             :         uuid_t          agi_uuid;       /* uuid of filesystem */
     665             :         __be32          agi_crc;        /* crc of agi sector */
     666             :         __be32          agi_pad32;
     667             :         __be64          agi_lsn;        /* last write sequence */
     668             : 
     669             :         __be32          agi_free_root; /* root of the free inode btree */
     670             :         __be32          agi_free_level;/* levels in free inode btree */
     671             : 
     672             :         __be32          agi_iblocks;    /* inobt blocks used */
     673             :         __be32          agi_fblocks;    /* finobt blocks used */
     674             : 
     675             :         /* structure must be padded to 64 bit alignment */
     676             : } xfs_agi_t;
     677             : 
     678             : #define XFS_AGI_CRC_OFF         offsetof(struct xfs_agi, agi_crc)
     679             : 
     680             : #define XFS_AGI_MAGICNUM        (1u << 0)
     681             : #define XFS_AGI_VERSIONNUM      (1u << 1)
     682             : #define XFS_AGI_SEQNO           (1u << 2)
     683             : #define XFS_AGI_LENGTH          (1u << 3)
     684             : #define XFS_AGI_COUNT           (1u << 4)
     685             : #define XFS_AGI_ROOT            (1u << 5)
     686             : #define XFS_AGI_LEVEL           (1u << 6)
     687             : #define XFS_AGI_FREECOUNT       (1u << 7)
     688             : #define XFS_AGI_NEWINO          (1u << 8)
     689             : #define XFS_AGI_DIRINO          (1u << 9)
     690             : #define XFS_AGI_UNLINKED        (1u << 10)
     691             : #define XFS_AGI_NUM_BITS_R1     11      /* end of the 1st agi logging region */
     692             : #define XFS_AGI_ALL_BITS_R1     ((1u << XFS_AGI_NUM_BITS_R1) - 1)
     693             : #define XFS_AGI_FREE_ROOT       (1u << 11)
     694             : #define XFS_AGI_FREE_LEVEL      (1u << 12)
     695             : #define XFS_AGI_IBLOCKS         (1u << 13) /* both inobt/finobt block counters */
     696             : #define XFS_AGI_NUM_BITS_R2     14
     697             : 
     698             : /* disk block (xfs_daddr_t) in the AG */
     699             : #define XFS_AGI_DADDR(mp)       ((xfs_daddr_t)(2 << (mp)->m_sectbb_log))
     700             : #define XFS_AGI_BLOCK(mp)       XFS_HDR_BLOCK(mp, XFS_AGI_DADDR(mp))
     701             : 
     702             : /*
     703             :  * The third a.g. block contains the a.g. freelist, an array
     704             :  * of block pointers to blocks owned by the allocation btree code.
     705             :  */
     706             : #define XFS_AGFL_DADDR(mp)      ((xfs_daddr_t)(3 << (mp)->m_sectbb_log))
     707             : #define XFS_AGFL_BLOCK(mp)      XFS_HDR_BLOCK(mp, XFS_AGFL_DADDR(mp))
     708             : #define XFS_BUF_TO_AGFL(bp)     ((struct xfs_agfl *)((bp)->b_addr))
     709             : 
     710             : struct xfs_agfl {
     711             :         __be32          agfl_magicnum;
     712             :         __be32          agfl_seqno;
     713             :         uuid_t          agfl_uuid;
     714             :         __be64          agfl_lsn;
     715             :         __be32          agfl_crc;
     716             : } __attribute__((packed));
     717             : 
     718             : #define XFS_AGFL_CRC_OFF        offsetof(struct xfs_agfl, agfl_crc)
     719             : 
     720             : #define XFS_AGB_TO_FSB(mp,agno,agbno)   \
     721             :         (((xfs_fsblock_t)(agno) << (mp)->m_sb.sb_agblklog) | (agbno))
     722             : #define XFS_FSB_TO_AGNO(mp,fsbno)       \
     723             :         ((xfs_agnumber_t)((fsbno) >> (mp)->m_sb.sb_agblklog))
     724             : #define XFS_FSB_TO_AGBNO(mp,fsbno)      \
     725             :         ((xfs_agblock_t)((fsbno) & xfs_mask32lo((mp)->m_sb.sb_agblklog)))
     726             : #define XFS_AGB_TO_DADDR(mp,agno,agbno) \
     727             :         ((xfs_daddr_t)XFS_FSB_TO_BB(mp, \
     728             :                 (xfs_fsblock_t)(agno) * (mp)->m_sb.sb_agblocks + (agbno)))
     729             : #define XFS_AG_DADDR(mp,agno,d)         (XFS_AGB_TO_DADDR(mp, agno, 0) + (d))
     730             : 
     731             : /*
     732             :  * For checking for bad ranges of xfs_daddr_t's, covering multiple
     733             :  * allocation groups or a single xfs_daddr_t that's a superblock copy.
     734             :  */
     735             : #define XFS_AG_CHECK_DADDR(mp,d,len)    \
     736             :         ((len) == 1 ? \
     737             :             ASSERT((d) == XFS_SB_DADDR || \
     738             :                    xfs_daddr_to_agbno(mp, d) != XFS_SB_DADDR) : \
     739             :             ASSERT(xfs_daddr_to_agno(mp, d) == \
     740             :                    xfs_daddr_to_agno(mp, (d) + (len) - 1)))
     741             : 
     742             : /*
     743             :  * Realtime bitmap information is accessed by the word, which is currently
     744             :  * stored in host-endian format.  Starting with the realtime groups feature,
     745             :  * the words are stored in le32 ondisk.
     746             :  */
     747             : union xfs_rtword_ondisk {
     748             :         __u32           raw;
     749             :         __le32          rtg;
     750             : };
     751             : 
     752             : /*
     753             :  * Realtime summary counts are accessed by the word, which is currently
     754             :  * stored in host-endian format.  Starting with the realtime groups feature,
     755             :  * the words are stored in be32 ondisk.
     756             :  */
     757             : union xfs_suminfo_ondisk {
     758             :         __u32           raw;
     759             :         __be32          rtg;
     760             : };
     761             : 
     762             : /*
     763             :  * Realtime allocation groups break the rt section into multiple pieces that
     764             :  * could be locked independently.  Realtime block group numbers are 32-bit
     765             :  * quantities.  Block numbers within a group are also 32-bit quantities, but
     766             :  * the upper bit must never be set.
     767             :  */
     768             : #define XFS_MAX_RGBLOCKS        ((xfs_rgblock_t)(1U << 31) - 1)
     769             : #define XFS_MAX_RGNUMBER        ((xfs_rgnumber_t)(-1U))
     770             : 
     771             : #define XFS_RTSB_MAGIC  0x58524750      /* 'XRGP' */
     772             : 
     773             : /*
     774             :  * Realtime superblock - on disk version.  Must be padded to 64 bit alignment.
     775             :  * The first block of each realtime group contains this superblock; this is
     776             :  * how we avoid having file data extents cross a group boundary.
     777             :  */
     778             : struct xfs_rtsb {
     779             :         __be32          rsb_magicnum;   /* magic number == XFS_RTSB_MAGIC */
     780             :         __be32          rsb_blocksize;  /* logical block size, bytes */
     781             :         __be64          rsb_rblocks;    /* number of realtime blocks */
     782             : 
     783             :         __be64          rsb_rextents;   /* number of realtime extents */
     784             :         __be64          rsb_lsn;        /* last write sequence */
     785             : 
     786             :         __be32          rsb_rgcount;    /* # of realtime groups */
     787             :         unsigned char   rsb_fname[XFSLABEL_MAX]; /* rt volume name */
     788             : 
     789             :         uuid_t          rsb_uuid;       /* user-visible file system unique id */
     790             : 
     791             :         __be32          rsb_rextsize;   /* realtime extent size, blocks */
     792             :         __be32          rsb_rbmblocks;  /* number of rt bitmap blocks */
     793             : 
     794             :         __be32          rsb_rgblocks;   /* rt blocks per group */
     795             :         __u8            rsb_blocklog;   /* log2 of sb_blocksize */
     796             :         __u8            rsb_sectlog;    /* log2 of sb_sectsize */
     797             :         __u8            rsb_rextslog;   /* log2 of sb_rextents */
     798             :         __u8            rsb_pad;
     799             : 
     800             :         __le32          rsb_crc;        /* superblock crc */
     801             :         __le32          rsb_pad2;
     802             : 
     803             :         uuid_t          rsb_meta_uuid;  /* metadata file system unique id */
     804             : 
     805             :         /* must be padded to 64 bit alignment */
     806             : };
     807             : 
     808             : #define XFS_RTSB_CRC_OFF        offsetof(struct xfs_rtsb, rsb_crc)
     809             : #define XFS_RTSB_DADDR          ((xfs_daddr_t)0) /* daddr in rt section */
     810             : 
     811             : /*
     812             :  * XFS Timestamps
     813             :  * ==============
     814             :  *
     815             :  * Traditional ondisk inode timestamps consist of signed 32-bit counters for
     816             :  * seconds and nanoseconds; time zero is the Unix epoch, Jan  1 00:00:00 UTC
     817             :  * 1970, which means that the timestamp epoch is the same as the Unix epoch.
     818             :  * Therefore, the ondisk min and max defined here can be used directly to
     819             :  * constrain the incore timestamps on a Unix system.  Note that we actually
     820             :  * encode a __be64 value on disk.
     821             :  *
     822             :  * When the bigtime feature is enabled, ondisk inode timestamps become an
     823             :  * unsigned 64-bit nanoseconds counter.  This means that the bigtime inode
     824             :  * timestamp epoch is the start of the classic timestamp range, which is
     825             :  * Dec 13 20:45:52 UTC 1901.  Because the epochs are not the same, callers
     826             :  * /must/ use the bigtime conversion functions when encoding and decoding raw
     827             :  * timestamps.
     828             :  */
     829             : typedef __be64 xfs_timestamp_t;
     830             : 
     831             : /* Legacy timestamp encoding format. */
     832             : struct xfs_legacy_timestamp {
     833             :         __be32          t_sec;          /* timestamp seconds */
     834             :         __be32          t_nsec;         /* timestamp nanoseconds */
     835             : };
     836             : 
     837             : /*
     838             :  * Smallest possible ondisk seconds value with traditional timestamps.  This
     839             :  * corresponds exactly with the incore timestamp Dec 13 20:45:52 UTC 1901.
     840             :  */
     841             : #define XFS_LEGACY_TIME_MIN     ((int64_t)S32_MIN)
     842             : 
     843             : /*
     844             :  * Largest possible ondisk seconds value with traditional timestamps.  This
     845             :  * corresponds exactly with the incore timestamp Jan 19 03:14:07 UTC 2038.
     846             :  */
     847             : #define XFS_LEGACY_TIME_MAX     ((int64_t)S32_MAX)
     848             : 
     849             : /*
     850             :  * Smallest possible ondisk seconds value with bigtime timestamps.  This
     851             :  * corresponds (after conversion to a Unix timestamp) with the traditional
     852             :  * minimum timestamp of Dec 13 20:45:52 UTC 1901.
     853             :  */
     854             : #define XFS_BIGTIME_TIME_MIN    ((int64_t)0)
     855             : 
     856             : /*
     857             :  * Largest supported ondisk seconds value with bigtime timestamps.  This
     858             :  * corresponds (after conversion to a Unix timestamp) with an incore timestamp
     859             :  * of Jul  2 20:20:24 UTC 2486.
     860             :  *
     861             :  * We round down the ondisk limit so that the bigtime quota and inode max
     862             :  * timestamps will be the same.
     863             :  */
     864             : #define XFS_BIGTIME_TIME_MAX    ((int64_t)((-1ULL / NSEC_PER_SEC) & ~0x3ULL))
     865             : 
     866             : /*
     867             :  * Bigtime epoch is set exactly to the minimum time value that a traditional
     868             :  * 32-bit timestamp can represent when using the Unix epoch as a reference.
     869             :  * Hence the Unix epoch is at a fixed offset into the supported bigtime
     870             :  * timestamp range.
     871             :  *
     872             :  * The bigtime epoch also matches the minimum value an on-disk 32-bit XFS
     873             :  * timestamp can represent so we will not lose any fidelity in converting
     874             :  * to/from unix and bigtime timestamps.
     875             :  *
     876             :  * The following conversion factor converts a seconds counter from the Unix
     877             :  * epoch to the bigtime epoch.
     878             :  */
     879             : #define XFS_BIGTIME_EPOCH_OFFSET        (-(int64_t)S32_MIN)
     880             : 
     881             : /* Convert a timestamp from the Unix epoch to the bigtime epoch. */
     882             : static inline uint64_t xfs_unix_to_bigtime(time64_t unix_seconds)
     883             : {
     884  8906481715 :         return (uint64_t)unix_seconds + XFS_BIGTIME_EPOCH_OFFSET;
     885             : }
     886             : 
     887             : /* Convert a timestamp from the bigtime epoch to the Unix epoch. */
     888             : static inline time64_t xfs_bigtime_to_unix(uint64_t ondisk_seconds)
     889             : {
     890  2229791473 :         return (time64_t)ondisk_seconds - XFS_BIGTIME_EPOCH_OFFSET;
     891             : }
     892             : 
     893             : /*
     894             :  * On-disk inode structure.
     895             :  *
     896             :  * This is just the header or "dinode core", the inode is expanded to fill a
     897             :  * variable size the leftover area split into a data and an attribute fork.
     898             :  * The format of the data and attribute fork depends on the format of the
     899             :  * inode as indicated by di_format and di_aformat.  To access the data and
     900             :  * attribute use the XFS_DFORK_DPTR, XFS_DFORK_APTR, and XFS_DFORK_PTR macros
     901             :  * below.
     902             :  *
     903             :  * There is a very similar struct xfs_log_dinode which matches the layout of
     904             :  * this structure, but is kept in native format instead of big endian.
     905             :  *
     906             :  * Note: di_flushiter is only used by v1/2 inodes - it's effectively a zeroed
     907             :  * padding field for v3 inodes.
     908             :  */
     909             : #define XFS_DINODE_MAGIC                0x494e  /* 'IN' */
     910             : struct xfs_dinode {
     911             :         __be16          di_magic;       /* inode magic # = XFS_DINODE_MAGIC */
     912             :         __be16          di_mode;        /* mode and type of file */
     913             :         __u8            di_version;     /* inode version */
     914             :         __u8            di_format;      /* format of di_c data */
     915             :         __be16          di_onlink;      /* old number of links to file */
     916             :         __be32          di_uid;         /* owner's user id */
     917             :         __be32          di_gid;         /* owner's group id */
     918             :         __be32          di_nlink;       /* number of links to file */
     919             :         __be16          di_projid_lo;   /* lower part of owner's project id */
     920             :         __be16          di_projid_hi;   /* higher part owner's project id */
     921             :         union {
     922             :                 /* Number of data fork extents if NREXT64 is set */
     923             :                 __be64  di_big_nextents;
     924             : 
     925             :                 /* Padding for V3 inodes without NREXT64 set. */
     926             :                 __be64  di_v3_pad;
     927             : 
     928             :                 /* Padding and inode flush counter for V2 inodes. */
     929             :                 struct {
     930             :                         __u8    di_v2_pad[6];
     931             :                         __be16  di_flushiter;
     932             :                 };
     933             :         };
     934             :         xfs_timestamp_t di_atime;       /* time last accessed */
     935             :         xfs_timestamp_t di_mtime;       /* time last modified */
     936             :         xfs_timestamp_t di_ctime;       /* time created/inode modified */
     937             :         __be64          di_size;        /* number of bytes in file */
     938             :         __be64          di_nblocks;     /* # of direct & btree blocks used */
     939             :         __be32          di_extsize;     /* basic/minimum extent size for file */
     940             :         union {
     941             :                 /*
     942             :                  * For V2 inodes and V3 inodes without NREXT64 set, this
     943             :                  * is the number of data and attr fork extents.
     944             :                  */
     945             :                 struct {
     946             :                         __be32  di_nextents;
     947             :                         __be16  di_anextents;
     948             :                 } __packed;
     949             : 
     950             :                 /* Number of attr fork extents if NREXT64 is set. */
     951             :                 struct {
     952             :                         __be32  di_big_anextents;
     953             :                         __be16  di_nrext64_pad;
     954             :                 } __packed;
     955             :         } __packed;
     956             :         __u8            di_forkoff;     /* attr fork offs, <<3 for 64b align */
     957             :         __s8            di_aformat;     /* format of attr fork's data */
     958             :         __be32          di_dmevmask;    /* DMIG event mask */
     959             :         __be16          di_dmstate;     /* DMIG state info */
     960             :         __be16          di_flags;       /* random flags, XFS_DIFLAG_... */
     961             :         __be32          di_gen;         /* generation number */
     962             : 
     963             :         /* di_next_unlinked is the only non-core field in the old dinode */
     964             :         __be32          di_next_unlinked;/* agi unlinked list ptr */
     965             : 
     966             :         /* start of the extended dinode, writable fields */
     967             :         __le32          di_crc;         /* CRC of the inode */
     968             :         __be64          di_changecount; /* number of attribute changes */
     969             :         __be64          di_lsn;         /* flush sequence */
     970             :         __be64          di_flags2;      /* more random flags */
     971             :         __be32          di_cowextsize;  /* basic cow extent size for file */
     972             :         __u8            di_pad2[12];    /* more padding for future expansion */
     973             : 
     974             :         /* fields only written to during inode creation */
     975             :         xfs_timestamp_t di_crtime;      /* time created */
     976             :         __be64          di_ino;         /* inode number */
     977             :         uuid_t          di_uuid;        /* UUID of the filesystem */
     978             : 
     979             :         /* structure must be padded to 64 bit alignment */
     980             : };
     981             : 
     982             : #define XFS_DINODE_CRC_OFF      offsetof(struct xfs_dinode, di_crc)
     983             : 
     984             : #define DI_MAX_FLUSH 0xffff
     985             : 
     986             : /*
     987             :  * Size of the core inode on disk.  Version 1 and 2 inodes have
     988             :  * the same size, but version 3 has grown a few additional fields.
     989             :  */
     990             : static inline uint xfs_dinode_size(int version)
     991             : {
     992  1825795964 :         if (version == 3)
     993  2041992915 :                 return sizeof(struct xfs_dinode);
     994             :         return offsetof(struct xfs_dinode, di_crc);
     995             : }
     996             : 
     997             : /*
     998             :  * The 32 bit link count in the inode theoretically maxes out at UINT_MAX.
     999             :  * Since the pathconf interface is signed, we use 2^31 - 1 instead.
    1000             :  */
    1001             : #define XFS_MAXLINK             ((1U << 31) - 1U)
    1002             : 
    1003             : /*
    1004             :  * Any file that hits the maximum ondisk link count should be pinned to avoid
    1005             :  * a use-after-free situation.
    1006             :  */
    1007             : #define XFS_NLINK_PINNED        (~0U)
    1008             : 
    1009             : /*
    1010             :  * Values for di_format
    1011             :  *
    1012             :  * This enum is used in string mapping in xfs_trace.h; please keep the
    1013             :  * TRACE_DEFINE_ENUMs for it up to date.
    1014             :  */
    1015             : enum xfs_dinode_fmt {
    1016             :         XFS_DINODE_FMT_DEV,             /* xfs_dev_t */
    1017             :         XFS_DINODE_FMT_LOCAL,           /* bulk data */
    1018             :         XFS_DINODE_FMT_EXTENTS,         /* struct xfs_bmbt_rec */
    1019             :         XFS_DINODE_FMT_BTREE,           /* struct xfs_bmdr_block */
    1020             :         XFS_DINODE_FMT_UUID,            /* added long ago, but never used */
    1021             :         XFS_DINODE_FMT_RMAP,            /* reverse mapping btree */
    1022             :         XFS_DINODE_FMT_REFCOUNT,        /* reference count btree */
    1023             : };
    1024             : 
    1025             : #define XFS_INODE_FORMAT_STR \
    1026             :         { XFS_DINODE_FMT_DEV,           "dev" }, \
    1027             :         { XFS_DINODE_FMT_LOCAL,         "local" }, \
    1028             :         { XFS_DINODE_FMT_EXTENTS,       "extent" }, \
    1029             :         { XFS_DINODE_FMT_BTREE,         "btree" }, \
    1030             :         { XFS_DINODE_FMT_UUID,          "uuid" }, \
    1031             :         { XFS_DINODE_FMT_RMAP,          "rmap" }, \
    1032             :         { XFS_DINODE_FMT_REFCOUNT,      "refcount" }
    1033             : 
    1034             : /*
    1035             :  * Max values for extnum and aextnum.
    1036             :  *
    1037             :  * The original on-disk extent counts were held in signed fields, resulting in
    1038             :  * maximum extent counts of 2^31 and 2^15 for the data and attr forks
    1039             :  * respectively. Similarly the maximum extent length is limited to 2^21 blocks
    1040             :  * by the 21-bit wide blockcount field of a BMBT extent record.
    1041             :  *
    1042             :  * The newly introduced data fork extent counter can hold a 64-bit value,
    1043             :  * however the maximum number of extents in a file is also limited to 2^54
    1044             :  * extents by the 54-bit wide startoff field of a BMBT extent record.
    1045             :  *
    1046             :  * It is further limited by the maximum supported file size of 2^63
    1047             :  * *bytes*. This leads to a maximum extent count for maximally sized filesystem
    1048             :  * blocks (64kB) of:
    1049             :  *
    1050             :  * 2^63 bytes / 2^16 bytes per block = 2^47 blocks
    1051             :  *
    1052             :  * Rounding up 47 to the nearest multiple of bits-per-byte results in 48. Hence
    1053             :  * 2^48 was chosen as the maximum data fork extent count.
    1054             :  *
    1055             :  * The maximum file size that can be represented by the data fork extent counter
    1056             :  * in the worst case occurs when all extents are 1 block in length and each
    1057             :  * block is 1KB in size.
    1058             :  *
    1059             :  * With XFS_MAX_EXTCNT_DATA_FORK_SMALL representing maximum extent count and
    1060             :  * with 1KB sized blocks, a file can reach upto,
    1061             :  * 1KB * (2^31) = 2TB
    1062             :  *
    1063             :  * This is much larger than the theoretical maximum size of a directory
    1064             :  * i.e. XFS_DIR2_SPACE_SIZE * XFS_DIR2_MAX_SPACES = ~96GB.
    1065             :  *
    1066             :  * Hence, a directory inode can never overflow its data fork extent counter.
    1067             :  */
    1068             : #define XFS_MAX_EXTCNT_DATA_FORK_LARGE  ((xfs_extnum_t)((1ULL << 48) - 1))
    1069             : #define XFS_MAX_EXTCNT_ATTR_FORK_LARGE  ((xfs_extnum_t)((1ULL << 32) - 1))
    1070             : #define XFS_MAX_EXTCNT_DATA_FORK_SMALL  ((xfs_extnum_t)((1ULL << 31) - 1))
    1071             : #define XFS_MAX_EXTCNT_ATTR_FORK_SMALL  ((xfs_extnum_t)((1ULL << 15) - 1))
    1072             : 
    1073             : /*
    1074             :  * When we upgrade an inode to the large extent counts, the maximum value by
    1075             :  * which the extent count can increase is bound by the change in size of the
    1076             :  * on-disk field. No upgrade operation should ever be adding more than a few
    1077             :  * tens of extents, so if we get a really large value it is a sign of a code bug
    1078             :  * or corruption.
    1079             :  */
    1080             : #define XFS_MAX_EXTCNT_UPGRADE_NR       \
    1081             :         min(XFS_MAX_EXTCNT_ATTR_FORK_LARGE - XFS_MAX_EXTCNT_ATTR_FORK_SMALL,    \
    1082             :             XFS_MAX_EXTCNT_DATA_FORK_LARGE - XFS_MAX_EXTCNT_DATA_FORK_SMALL)
    1083             : 
    1084             : /*
    1085             :  * Inode minimum and maximum sizes.
    1086             :  */
    1087             : #define XFS_DINODE_MIN_LOG      8
    1088             : #define XFS_DINODE_MAX_LOG      11
    1089             : #define XFS_DINODE_MIN_SIZE     (1 << XFS_DINODE_MIN_LOG)
    1090             : #define XFS_DINODE_MAX_SIZE     (1 << XFS_DINODE_MAX_LOG)
    1091             : 
    1092             : /*
    1093             :  * Inode size for given fs.
    1094             :  */
    1095             : #define XFS_DINODE_SIZE(mp) \
    1096             :         (xfs_has_v3inodes(mp) ? \
    1097             :                 sizeof(struct xfs_dinode) : \
    1098             :                 offsetof(struct xfs_dinode, di_crc))
    1099             : #define XFS_LITINO(mp) \
    1100             :         ((mp)->m_sb.sb_inodesize - XFS_DINODE_SIZE(mp))
    1101             : 
    1102             : /*
    1103             :  * Inode data & attribute fork sizes, per inode.
    1104             :  */
    1105             : #define XFS_DFORK_BOFF(dip)             ((int)((dip)->di_forkoff << 3))
    1106             : 
    1107             : #define XFS_DFORK_DSIZE(dip,mp) \
    1108             :         ((dip)->di_forkoff ? XFS_DFORK_BOFF(dip) : XFS_LITINO(mp))
    1109             : #define XFS_DFORK_ASIZE(dip,mp) \
    1110             :         ((dip)->di_forkoff ? XFS_LITINO(mp) - XFS_DFORK_BOFF(dip) : 0)
    1111             : #define XFS_DFORK_SIZE(dip,mp,w) \
    1112             :         ((w) == XFS_DATA_FORK ? \
    1113             :                 XFS_DFORK_DSIZE(dip, mp) : \
    1114             :                 XFS_DFORK_ASIZE(dip, mp))
    1115             : 
    1116             : #define XFS_DFORK_MAXEXT(dip, mp, w) \
    1117             :         (XFS_DFORK_SIZE(dip, mp, w) / sizeof(struct xfs_bmbt_rec))
    1118             : 
    1119             : /*
    1120             :  * Return pointers to the data or attribute forks.
    1121             :  */
    1122             : #define XFS_DFORK_DPTR(dip) \
    1123             :         ((char *)dip + xfs_dinode_size(dip->di_version))
    1124             : #define XFS_DFORK_APTR(dip)     \
    1125             :         (XFS_DFORK_DPTR(dip) + XFS_DFORK_BOFF(dip))
    1126             : #define XFS_DFORK_PTR(dip,w)    \
    1127             :         ((void *)((w) == XFS_DATA_FORK ? XFS_DFORK_DPTR(dip) : \
    1128             :                                          XFS_DFORK_APTR(dip)))
    1129             : 
    1130             : #define XFS_DFORK_FORMAT(dip,w) \
    1131             :         ((w) == XFS_DATA_FORK ? \
    1132             :                 (dip)->di_format : \
    1133             :                 (dip)->di_aformat)
    1134             : 
    1135             : /*
    1136             :  * For block and character special files the 32bit dev_t is stored at the
    1137             :  * beginning of the data fork.
    1138             :  */
    1139   207416835 : static inline xfs_dev_t xfs_dinode_get_rdev(struct xfs_dinode *dip)
    1140             : {
    1141   207416835 :         return be32_to_cpu(*(__be32 *)XFS_DFORK_DPTR(dip));
    1142             : }
    1143             : 
    1144     8785106 : static inline void xfs_dinode_put_rdev(struct xfs_dinode *dip, xfs_dev_t rdev)
    1145             : {
    1146    17570212 :         *(__be32 *)XFS_DFORK_DPTR(dip) = cpu_to_be32(rdev);
    1147     8785106 : }
    1148             : 
    1149             : /*
    1150             :  * Values for di_flags
    1151             :  */
    1152             : #define XFS_DIFLAG_REALTIME_BIT  0      /* file's blocks come from rt area */
    1153             : #define XFS_DIFLAG_PREALLOC_BIT  1      /* file space has been preallocated */
    1154             : #define XFS_DIFLAG_NEWRTBM_BIT   2      /* for rtbitmap inode, new format */
    1155             : #define XFS_DIFLAG_IMMUTABLE_BIT 3      /* inode is immutable */
    1156             : #define XFS_DIFLAG_APPEND_BIT    4      /* inode is append-only */
    1157             : #define XFS_DIFLAG_SYNC_BIT      5      /* inode is written synchronously */
    1158             : #define XFS_DIFLAG_NOATIME_BIT   6      /* do not update atime */
    1159             : #define XFS_DIFLAG_NODUMP_BIT    7      /* do not dump */
    1160             : #define XFS_DIFLAG_RTINHERIT_BIT 8      /* create with realtime bit set */
    1161             : #define XFS_DIFLAG_PROJINHERIT_BIT   9  /* create with parents projid */
    1162             : #define XFS_DIFLAG_NOSYMLINKS_BIT   10  /* disallow symlink creation */
    1163             : #define XFS_DIFLAG_EXTSIZE_BIT      11  /* inode extent size allocator hint */
    1164             : #define XFS_DIFLAG_EXTSZINHERIT_BIT 12  /* inherit inode extent size */
    1165             : #define XFS_DIFLAG_NODEFRAG_BIT     13  /* do not reorganize/defragment */
    1166             : #define XFS_DIFLAG_FILESTREAM_BIT   14  /* use filestream allocator */
    1167             : /* Do not use bit 15, di_flags is legacy and unchanging now */
    1168             : 
    1169             : #define XFS_DIFLAG_REALTIME      (1 << XFS_DIFLAG_REALTIME_BIT)
    1170             : #define XFS_DIFLAG_PREALLOC      (1 << XFS_DIFLAG_PREALLOC_BIT)
    1171             : #define XFS_DIFLAG_NEWRTBM       (1 << XFS_DIFLAG_NEWRTBM_BIT)
    1172             : #define XFS_DIFLAG_IMMUTABLE     (1 << XFS_DIFLAG_IMMUTABLE_BIT)
    1173             : #define XFS_DIFLAG_APPEND        (1 << XFS_DIFLAG_APPEND_BIT)
    1174             : #define XFS_DIFLAG_SYNC          (1 << XFS_DIFLAG_SYNC_BIT)
    1175             : #define XFS_DIFLAG_NOATIME       (1 << XFS_DIFLAG_NOATIME_BIT)
    1176             : #define XFS_DIFLAG_NODUMP        (1 << XFS_DIFLAG_NODUMP_BIT)
    1177             : #define XFS_DIFLAG_RTINHERIT     (1 << XFS_DIFLAG_RTINHERIT_BIT)
    1178             : #define XFS_DIFLAG_PROJINHERIT   (1 << XFS_DIFLAG_PROJINHERIT_BIT)
    1179             : #define XFS_DIFLAG_NOSYMLINKS    (1 << XFS_DIFLAG_NOSYMLINKS_BIT)
    1180             : #define XFS_DIFLAG_EXTSIZE       (1 << XFS_DIFLAG_EXTSIZE_BIT)
    1181             : #define XFS_DIFLAG_EXTSZINHERIT  (1 << XFS_DIFLAG_EXTSZINHERIT_BIT)
    1182             : #define XFS_DIFLAG_NODEFRAG      (1 << XFS_DIFLAG_NODEFRAG_BIT)
    1183             : #define XFS_DIFLAG_FILESTREAM    (1 << XFS_DIFLAG_FILESTREAM_BIT)
    1184             : 
    1185             : #define XFS_DIFLAG_ANY \
    1186             :         (XFS_DIFLAG_REALTIME | XFS_DIFLAG_PREALLOC | XFS_DIFLAG_NEWRTBM | \
    1187             :          XFS_DIFLAG_IMMUTABLE | XFS_DIFLAG_APPEND | XFS_DIFLAG_SYNC | \
    1188             :          XFS_DIFLAG_NOATIME | XFS_DIFLAG_NODUMP | XFS_DIFLAG_RTINHERIT | \
    1189             :          XFS_DIFLAG_PROJINHERIT | XFS_DIFLAG_NOSYMLINKS | XFS_DIFLAG_EXTSIZE | \
    1190             :          XFS_DIFLAG_EXTSZINHERIT | XFS_DIFLAG_NODEFRAG | XFS_DIFLAG_FILESTREAM)
    1191             : 
    1192             : /*
    1193             :  * Values for di_flags2 These start by being exposed to userspace in the upper
    1194             :  * 16 bits of the XFS_XFLAG_s range.
    1195             :  */
    1196             : #define XFS_DIFLAG2_DAX_BIT     0       /* use DAX for this inode */
    1197             : #define XFS_DIFLAG2_REFLINK_BIT 1       /* file's blocks may be shared */
    1198             : #define XFS_DIFLAG2_COWEXTSIZE_BIT   2  /* copy on write extent size hint */
    1199             : #define XFS_DIFLAG2_BIGTIME_BIT 3       /* big timestamps */
    1200             : #define XFS_DIFLAG2_NREXT64_BIT 4       /* large extent counters */
    1201             : #define XFS_DIFLAG2_METADIR_BIT 63      /* filesystem metadata */
    1202             : 
    1203             : #define XFS_DIFLAG2_DAX         (1ULL << XFS_DIFLAG2_DAX_BIT)
    1204             : #define XFS_DIFLAG2_REFLINK     (1ULL << XFS_DIFLAG2_REFLINK_BIT)
    1205             : #define XFS_DIFLAG2_COWEXTSIZE  (1ULL << XFS_DIFLAG2_COWEXTSIZE_BIT)
    1206             : #define XFS_DIFLAG2_BIGTIME     (1ULL << XFS_DIFLAG2_BIGTIME_BIT)
    1207             : #define XFS_DIFLAG2_NREXT64     (1ULL << XFS_DIFLAG2_NREXT64_BIT)
    1208             : 
    1209             : /*
    1210             :  * The inode contains filesystem metadata and can be found through the metadata
    1211             :  * directory tree.  Metadata inodes must satisfy the following constraints:
    1212             :  *
    1213             :  * - V5 filesystem (and ftype) are enabled;
    1214             :  * - The only valid modes are regular files and directories;
    1215             :  * - The access bits must be zero;
    1216             :  * - DMAPI event and state masks are zero;
    1217             :  * - The user, group, and project IDs must be zero;
    1218             :  * - The immutable, sync, noatime, nodump, nodefrag flags must be set.
    1219             :  * - The dax flag must not be set.
    1220             :  * - Directories must have nosymlinks set.
    1221             :  *
    1222             :  * These requirements are chosen defensively to minimize the ability of
    1223             :  * userspace to read or modify the contents, should a metadata file ever
    1224             :  * escape to userspace.
    1225             :  *
    1226             :  * There are further constraints on the directory tree itself:
    1227             :  *
    1228             :  * - Metadata inodes must never be resolvable through the root directory;
    1229             :  * - They must never be accessed by userspace;
    1230             :  * - Metadata directory entries must have correct ftype.
    1231             :  */
    1232             : #define XFS_DIFLAG2_METADIR     (1ULL << XFS_DIFLAG2_METADIR_BIT)
    1233             : 
    1234             : #define XFS_DIFLAG2_ANY \
    1235             :         (XFS_DIFLAG2_DAX | XFS_DIFLAG2_REFLINK | XFS_DIFLAG2_COWEXTSIZE | \
    1236             :          XFS_DIFLAG2_BIGTIME | XFS_DIFLAG2_NREXT64 | XFS_DIFLAG2_METADIR)
    1237             : 
    1238             : static inline bool xfs_dinode_has_bigtime(const struct xfs_dinode *dip)
    1239             : {
    1240  5574678272 :         return dip->di_version >= 3 &&
    1241  2787266916 :                (dip->di_flags2 & cpu_to_be64(XFS_DIFLAG2_BIGTIME));
    1242             : }
    1243             : 
    1244             : static inline bool xfs_dinode_has_large_extent_counts(
    1245             :         const struct xfs_dinode *dip)
    1246             : {
    1247  7313680656 :         return dip->di_version >= 3 &&
    1248  3656787185 :                (dip->di_flags2 & cpu_to_be64(XFS_DIFLAG2_NREXT64));
    1249             : }
    1250             : 
    1251             : /*
    1252             :  * Inode number format:
    1253             :  * low inopblog bits - offset in block
    1254             :  * next agblklog bits - block number in ag
    1255             :  * next agno_log bits - ag number
    1256             :  * high agno_log-agblklog-inopblog bits - 0
    1257             :  */
    1258             : #define XFS_INO_MASK(k)                 (uint32_t)((1ULL << (k)) - 1)
    1259             : #define XFS_INO_OFFSET_BITS(mp)         (mp)->m_sb.sb_inopblog
    1260             : #define XFS_INO_AGBNO_BITS(mp)          (mp)->m_sb.sb_agblklog
    1261             : #define XFS_INO_AGINO_BITS(mp)          ((mp)->m_ino_geo.agino_log)
    1262             : #define XFS_INO_AGNO_BITS(mp)           (mp)->m_agno_log
    1263             : #define XFS_INO_BITS(mp)                \
    1264             :         XFS_INO_AGNO_BITS(mp) + XFS_INO_AGINO_BITS(mp)
    1265             : #define XFS_INO_TO_AGNO(mp,i)           \
    1266             :         ((xfs_agnumber_t)((i) >> XFS_INO_AGINO_BITS(mp)))
    1267             : #define XFS_INO_TO_AGINO(mp,i)          \
    1268             :         ((xfs_agino_t)(i) & XFS_INO_MASK(XFS_INO_AGINO_BITS(mp)))
    1269             : #define XFS_INO_TO_AGBNO(mp,i)          \
    1270             :         (((xfs_agblock_t)(i) >> XFS_INO_OFFSET_BITS(mp)) & \
    1271             :                 XFS_INO_MASK(XFS_INO_AGBNO_BITS(mp)))
    1272             : #define XFS_INO_TO_OFFSET(mp,i)         \
    1273             :         ((int)(i) & XFS_INO_MASK(XFS_INO_OFFSET_BITS(mp)))
    1274             : #define XFS_INO_TO_FSB(mp,i)            \
    1275             :         XFS_AGB_TO_FSB(mp, XFS_INO_TO_AGNO(mp,i), XFS_INO_TO_AGBNO(mp,i))
    1276             : #define XFS_AGINO_TO_INO(mp,a,i)        \
    1277             :         (((xfs_ino_t)(a) << XFS_INO_AGINO_BITS(mp)) | (i))
    1278             : #define XFS_AGINO_TO_AGBNO(mp,i)        ((i) >> XFS_INO_OFFSET_BITS(mp))
    1279             : #define XFS_AGINO_TO_OFFSET(mp,i)       \
    1280             :         ((i) & XFS_INO_MASK(XFS_INO_OFFSET_BITS(mp)))
    1281             : #define XFS_OFFBNO_TO_AGINO(mp,b,o)     \
    1282             :         ((xfs_agino_t)(((b) << XFS_INO_OFFSET_BITS(mp)) | (o)))
    1283             : #define XFS_FSB_TO_INO(mp, b)   ((xfs_ino_t)((b) << XFS_INO_OFFSET_BITS(mp)))
    1284             : #define XFS_AGB_TO_AGINO(mp, b) ((xfs_agino_t)((b) << XFS_INO_OFFSET_BITS(mp)))
    1285             : 
    1286             : #define XFS_MAXINUMBER          ((xfs_ino_t)((1ULL << 56) - 1ULL))
    1287             : #define XFS_MAXINUMBER_32       ((xfs_ino_t)((1ULL << 32) - 1ULL))
    1288             : 
    1289             : /*
    1290             :  * RealTime Device format definitions
    1291             :  */
    1292             : 
    1293             : /* Min and max rt extent sizes, specified in bytes */
    1294             : #define XFS_MAX_RTEXTSIZE       (1024 * 1024 * 1024)    /* 1GB */
    1295             : #define XFS_DFL_RTEXTSIZE       (64 * 1024)             /* 64kB */
    1296             : #define XFS_MIN_RTEXTSIZE       (4 * 1024)              /* 4kB */
    1297             : 
    1298             : #define XFS_BLOCKSIZE(mp)       ((mp)->m_sb.sb_blocksize)
    1299             : #define XFS_BLOCKMASK(mp)       ((mp)->m_blockmask)
    1300             : 
    1301             : /*
    1302             :  * RT bit manipulation macros.
    1303             :  */
    1304             : #define XFS_RTBITMAP_MAGIC      0x424D505A      /* BMPZ */
    1305             : #define XFS_RTSUMMARY_MAGIC     0x53554D59      /* SUMY */
    1306             : 
    1307             : struct xfs_rtbuf_blkinfo {
    1308             :         __be32          rt_magic;       /* validity check on block */
    1309             :         __be32          rt_crc;         /* CRC of block */
    1310             :         __be64          rt_owner;       /* inode that owns the block */
    1311             :         __be64          rt_blkno;       /* first block of the buffer */
    1312             :         __be64          rt_lsn;         /* sequence number of last write */
    1313             :         uuid_t          rt_uuid;        /* filesystem we belong to */
    1314             : };
    1315             : 
    1316             : #define XFS_RTBUF_CRC_OFF \
    1317             :         offsetof(struct xfs_rtbuf_blkinfo, rt_crc)
    1318             : 
    1319             : #define XFS_RTMIN(a,b)  ((a) < (b) ? (a) : (b))
    1320             : #define XFS_RTMAX(a,b)  ((a) > (b) ? (a) : (b))
    1321             : 
    1322             : #define XFS_RTLOBIT(w)  xfs_lowbit32(w)
    1323             : #define XFS_RTHIBIT(w)  xfs_highbit32(w)
    1324             : 
    1325             : #define XFS_RTBLOCKLOG(b)       xfs_highbit64(b)
    1326             : 
    1327             : /*
    1328             :  * Dquot and dquot block format definitions
    1329             :  */
    1330             : #define XFS_DQUOT_MAGIC         0x4451          /* 'DQ' */
    1331             : #define XFS_DQUOT_VERSION       (uint8_t)0x01   /* latest version number */
    1332             : 
    1333             : #define XFS_DQTYPE_USER         (1u << 0) /* user dquot record */
    1334             : #define XFS_DQTYPE_PROJ         (1u << 1) /* project dquot record */
    1335             : #define XFS_DQTYPE_GROUP        (1u << 2) /* group dquot record */
    1336             : #define XFS_DQTYPE_BIGTIME      (1u << 7) /* large expiry timestamps */
    1337             : 
    1338             : /* bitmask to determine if this is a user/group/project dquot */
    1339             : #define XFS_DQTYPE_REC_MASK     (XFS_DQTYPE_USER | \
    1340             :                                  XFS_DQTYPE_PROJ | \
    1341             :                                  XFS_DQTYPE_GROUP)
    1342             : 
    1343             : #define XFS_DQTYPE_ANY          (XFS_DQTYPE_REC_MASK | \
    1344             :                                  XFS_DQTYPE_BIGTIME)
    1345             : 
    1346             : /*
    1347             :  * XFS Quota Timers
    1348             :  * ================
    1349             :  *
    1350             :  * Traditional quota grace period expiration timers are an unsigned 32-bit
    1351             :  * seconds counter; time zero is the Unix epoch, Jan  1 00:00:01 UTC 1970.
    1352             :  * Note that an expiration value of zero means that the quota limit has not
    1353             :  * been reached, and therefore no expiration has been set.  Therefore, the
    1354             :  * ondisk min and max defined here can be used directly to constrain the incore
    1355             :  * quota expiration timestamps on a Unix system.
    1356             :  *
    1357             :  * When bigtime is enabled, we trade two bits of precision to expand the
    1358             :  * expiration timeout range to match that of big inode timestamps.  The min and
    1359             :  * max recorded here are the on-disk limits, not a Unix timestamp.
    1360             :  *
    1361             :  * The grace period for each quota type is stored in the root dquot (id = 0)
    1362             :  * and is applied to a non-root dquot when it exceeds the soft or hard limits.
    1363             :  * The length of quota grace periods are unsigned 32-bit quantities measured in
    1364             :  * units of seconds.  A value of zero means to use the default period.
    1365             :  */
    1366             : 
    1367             : /*
    1368             :  * Smallest possible ondisk quota expiration value with traditional timestamps.
    1369             :  * This corresponds exactly with the incore expiration Jan  1 00:00:01 UTC 1970.
    1370             :  */
    1371             : #define XFS_DQ_LEGACY_EXPIRY_MIN        ((int64_t)1)
    1372             : 
    1373             : /*
    1374             :  * Largest possible ondisk quota expiration value with traditional timestamps.
    1375             :  * This corresponds exactly with the incore expiration Feb  7 06:28:15 UTC 2106.
    1376             :  */
    1377             : #define XFS_DQ_LEGACY_EXPIRY_MAX        ((int64_t)U32_MAX)
    1378             : 
    1379             : /*
    1380             :  * Smallest possible ondisk quota expiration value with bigtime timestamps.
    1381             :  * This corresponds (after conversion to a Unix timestamp) with the incore
    1382             :  * expiration of Jan  1 00:00:04 UTC 1970.
    1383             :  */
    1384             : #define XFS_DQ_BIGTIME_EXPIRY_MIN       (XFS_DQ_LEGACY_EXPIRY_MIN)
    1385             : 
    1386             : /*
    1387             :  * Largest supported ondisk quota expiration value with bigtime timestamps.
    1388             :  * This corresponds (after conversion to a Unix timestamp) with an incore
    1389             :  * expiration of Jul  2 20:20:24 UTC 2486.
    1390             :  *
    1391             :  * The ondisk field supports values up to -1U, which corresponds to an incore
    1392             :  * expiration in 2514.  This is beyond the maximum the bigtime inode timestamp,
    1393             :  * so we cap the maximum bigtime quota expiration to the max inode timestamp.
    1394             :  */
    1395             : #define XFS_DQ_BIGTIME_EXPIRY_MAX       ((int64_t)4074815106U)
    1396             : 
    1397             : /*
    1398             :  * The following conversion factors assist in converting a quota expiration
    1399             :  * timestamp between the incore and ondisk formats.
    1400             :  */
    1401             : #define XFS_DQ_BIGTIME_SHIFT    (2)
    1402             : #define XFS_DQ_BIGTIME_SLACK    ((int64_t)(1ULL << XFS_DQ_BIGTIME_SHIFT) - 1)
    1403             : 
    1404             : /* Convert an incore quota expiration timestamp to an ondisk bigtime value. */
    1405             : static inline uint32_t xfs_dq_unix_to_bigtime(time64_t unix_seconds)
    1406             : {
    1407             :         /*
    1408             :          * Round the expiration timestamp up to the nearest bigtime timestamp
    1409             :          * that we can store, to give users the most time to fix problems.
    1410             :          */
    1411        9505 :         return ((uint64_t)unix_seconds + XFS_DQ_BIGTIME_SLACK) >>
    1412             :                         XFS_DQ_BIGTIME_SHIFT;
    1413             : }
    1414             : 
    1415             : /* Convert an ondisk bigtime quota expiration value to an incore timestamp. */
    1416             : static inline time64_t xfs_dq_bigtime_to_unix(uint32_t ondisk_seconds)
    1417             : {
    1418         228 :         return (time64_t)ondisk_seconds << XFS_DQ_BIGTIME_SHIFT;
    1419             : }
    1420             : 
    1421             : /*
    1422             :  * Default quota grace periods, ranging from zero (use the compiled defaults)
    1423             :  * to ~136 years.  These are applied to a non-root dquot that has exceeded
    1424             :  * either limit.
    1425             :  */
    1426             : #define XFS_DQ_GRACE_MIN                ((int64_t)0)
    1427             : #define XFS_DQ_GRACE_MAX                ((int64_t)U32_MAX)
    1428             : 
    1429             : /*
    1430             :  * This is the main portion of the on-disk representation of quota information
    1431             :  * for a user.  We pad this with some more expansion room to construct the on
    1432             :  * disk structure.
    1433             :  */
    1434             : struct xfs_disk_dquot {
    1435             :         __be16          d_magic;        /* dquot magic = XFS_DQUOT_MAGIC */
    1436             :         __u8            d_version;      /* dquot version */
    1437             :         __u8            d_type;         /* XFS_DQTYPE_USER/PROJ/GROUP */
    1438             :         __be32          d_id;           /* user,project,group id */
    1439             :         __be64          d_blk_hardlimit;/* absolute limit on disk blks */
    1440             :         __be64          d_blk_softlimit;/* preferred limit on disk blks */
    1441             :         __be64          d_ino_hardlimit;/* maximum # allocated inodes */
    1442             :         __be64          d_ino_softlimit;/* preferred inode limit */
    1443             :         __be64          d_bcount;       /* disk blocks owned by the user */
    1444             :         __be64          d_icount;       /* inodes owned by the user */
    1445             :         __be32          d_itimer;       /* zero if within inode limits if not,
    1446             :                                            this is when we refuse service */
    1447             :         __be32          d_btimer;       /* similar to above; for disk blocks */
    1448             :         __be16          d_iwarns;       /* warnings issued wrt num inodes */
    1449             :         __be16          d_bwarns;       /* warnings issued wrt disk blocks */
    1450             :         __be32          d_pad0;         /* 64 bit align */
    1451             :         __be64          d_rtb_hardlimit;/* absolute limit on realtime blks */
    1452             :         __be64          d_rtb_softlimit;/* preferred limit on RT disk blks */
    1453             :         __be64          d_rtbcount;     /* realtime blocks owned */
    1454             :         __be32          d_rtbtimer;     /* similar to above; for RT disk blocks */
    1455             :         __be16          d_rtbwarns;     /* warnings issued wrt RT disk blocks */
    1456             :         __be16          d_pad;
    1457             : };
    1458             : 
    1459             : /*
    1460             :  * This is what goes on disk. This is separated from the xfs_disk_dquot because
    1461             :  * carrying the unnecessary padding would be a waste of memory.
    1462             :  */
    1463             : struct xfs_dqblk {
    1464             :         struct xfs_disk_dquot   dd_diskdq; /* portion living incore as well */
    1465             :         char                    dd_fill[4];/* filling for posterity */
    1466             : 
    1467             :         /*
    1468             :          * These two are only present on filesystems with the CRC bits set.
    1469             :          */
    1470             :         __be32            dd_crc;       /* checksum */
    1471             :         __be64            dd_lsn;       /* last modification in log */
    1472             :         uuid_t            dd_uuid;      /* location information */
    1473             : };
    1474             : 
    1475             : #define XFS_DQUOT_CRC_OFF       offsetof(struct xfs_dqblk, dd_crc)
    1476             : 
    1477             : /*
    1478             :  * This defines the unit of allocation of dquots.
    1479             :  *
    1480             :  * Currently, it is just one file system block, and a 4K blk contains 30
    1481             :  * (136 * 30 = 4080) dquots. It's probably not worth trying to make
    1482             :  * this more dynamic.
    1483             :  *
    1484             :  * However, if this number is changed, we have to make sure that we don't
    1485             :  * implicitly assume that we do allocations in chunks of a single filesystem
    1486             :  * block in the dquot/xqm code.
    1487             :  *
    1488             :  * This is part of the ondisk format because the structure size is not a power
    1489             :  * of two, which leaves slack at the end of the disk block.
    1490             :  */
    1491             : #define XFS_DQUOT_CLUSTER_SIZE_FSB      (xfs_filblks_t)1
    1492             : 
    1493             : /*
    1494             :  * Remote symlink format and access functions.
    1495             :  */
    1496             : #define XFS_SYMLINK_MAGIC       0x58534c4d      /* XSLM */
    1497             : 
    1498             : struct xfs_dsymlink_hdr {
    1499             :         __be32  sl_magic;
    1500             :         __be32  sl_offset;
    1501             :         __be32  sl_bytes;
    1502             :         __be32  sl_crc;
    1503             :         uuid_t  sl_uuid;
    1504             :         __be64  sl_owner;
    1505             :         __be64  sl_blkno;
    1506             :         __be64  sl_lsn;
    1507             : };
    1508             : 
    1509             : #define XFS_SYMLINK_CRC_OFF     offsetof(struct xfs_dsymlink_hdr, sl_crc)
    1510             : 
    1511             : #define XFS_SYMLINK_MAXLEN      1024
    1512             : /*
    1513             :  * The maximum pathlen is 1024 bytes. Since the minimum file system
    1514             :  * blocksize is 512 bytes, we can get a max of 3 extents back from
    1515             :  * bmapi when crc headers are taken into account.
    1516             :  */
    1517             : #define XFS_SYMLINK_MAPS 3
    1518             : 
    1519             : #define XFS_SYMLINK_BUF_SPACE(mp, bufsize)      \
    1520             :         ((bufsize) - (xfs_has_crc((mp)) ? \
    1521             :                         sizeof(struct xfs_dsymlink_hdr) : 0))
    1522             : 
    1523             : 
    1524             : /*
    1525             :  * Allocation Btree format definitions
    1526             :  *
    1527             :  * There are two on-disk btrees, one sorted by blockno and one sorted
    1528             :  * by blockcount and blockno.  All blocks look the same to make the code
    1529             :  * simpler; if we have time later, we'll make the optimizations.
    1530             :  */
    1531             : #define XFS_ABTB_MAGIC          0x41425442      /* 'ABTB' for bno tree */
    1532             : #define XFS_ABTB_CRC_MAGIC      0x41423342      /* 'AB3B' */
    1533             : #define XFS_ABTC_MAGIC          0x41425443      /* 'ABTC' for cnt tree */
    1534             : #define XFS_ABTC_CRC_MAGIC      0x41423343      /* 'AB3C' */
    1535             : 
    1536             : /*
    1537             :  * Data record/key structure
    1538             :  */
    1539             : typedef struct xfs_alloc_rec {
    1540             :         __be32          ar_startblock;  /* starting block number */
    1541             :         __be32          ar_blockcount;  /* count of free blocks */
    1542             : } xfs_alloc_rec_t, xfs_alloc_key_t;
    1543             : 
    1544             : typedef struct xfs_alloc_rec_incore {
    1545             :         xfs_agblock_t   ar_startblock;  /* starting block number */
    1546             :         xfs_extlen_t    ar_blockcount;  /* count of free blocks */
    1547             : } xfs_alloc_rec_incore_t;
    1548             : 
    1549             : /* btree pointer type */
    1550             : typedef __be32 xfs_alloc_ptr_t;
    1551             : 
    1552             : /*
    1553             :  * Block numbers in the AG:
    1554             :  * SB is sector 0, AGF is sector 1, AGI is sector 2, AGFL is sector 3.
    1555             :  */
    1556             : #define XFS_BNO_BLOCK(mp)       ((xfs_agblock_t)(XFS_AGFL_BLOCK(mp) + 1))
    1557             : #define XFS_CNT_BLOCK(mp)       ((xfs_agblock_t)(XFS_BNO_BLOCK(mp) + 1))
    1558             : 
    1559             : 
    1560             : /*
    1561             :  * Inode Allocation Btree format definitions
    1562             :  *
    1563             :  * There is a btree for the inode map per allocation group.
    1564             :  */
    1565             : #define XFS_IBT_MAGIC           0x49414254      /* 'IABT' */
    1566             : #define XFS_IBT_CRC_MAGIC       0x49414233      /* 'IAB3' */
    1567             : #define XFS_FIBT_MAGIC          0x46494254      /* 'FIBT' */
    1568             : #define XFS_FIBT_CRC_MAGIC      0x46494233      /* 'FIB3' */
    1569             : 
    1570             : typedef uint64_t        xfs_inofree_t;
    1571             : #define XFS_INODES_PER_CHUNK            (NBBY * sizeof(xfs_inofree_t))
    1572             : #define XFS_INODES_PER_CHUNK_LOG        (XFS_NBBYLOG + 3)
    1573             : #define XFS_INOBT_ALL_FREE              ((xfs_inofree_t)-1)
    1574             : #define XFS_INOBT_MASK(i)               ((xfs_inofree_t)1 << (i))
    1575             : 
    1576             : #define XFS_INOBT_HOLEMASK_FULL         0       /* holemask for full chunk */
    1577             : #define XFS_INOBT_HOLEMASK_BITS         (NBBY * sizeof(uint16_t))
    1578             : #define XFS_INODES_PER_HOLEMASK_BIT     \
    1579             :         (XFS_INODES_PER_CHUNK / (NBBY * sizeof(uint16_t)))
    1580             : 
    1581             : static inline xfs_inofree_t xfs_inobt_maskn(int i, int n)
    1582             : {
    1583  5184214901 :         return ((n >= XFS_INODES_PER_CHUNK ? 0 : XFS_INOBT_MASK(n)) - 1) << i;
    1584             : }
    1585             : 
    1586             : /*
    1587             :  * The on-disk inode record structure has two formats. The original "full"
    1588             :  * format uses a 4-byte freecount. The "sparse" format uses a 1-byte freecount
    1589             :  * and replaces the 3 high-order freecount bytes wth the holemask and inode
    1590             :  * count.
    1591             :  *
    1592             :  * The holemask of the sparse record format allows an inode chunk to have holes
    1593             :  * that refer to blocks not owned by the inode record. This facilitates inode
    1594             :  * allocation in the event of severe free space fragmentation.
    1595             :  */
    1596             : typedef struct xfs_inobt_rec {
    1597             :         __be32          ir_startino;    /* starting inode number */
    1598             :         union {
    1599             :                 struct {
    1600             :                         __be32  ir_freecount;   /* count of free inodes */
    1601             :                 } f;
    1602             :                 struct {
    1603             :                         __be16  ir_holemask;/* hole mask for sparse chunks */
    1604             :                         __u8    ir_count;       /* total inode count */
    1605             :                         __u8    ir_freecount;   /* count of free inodes */
    1606             :                 } sp;
    1607             :         } ir_u;
    1608             :         __be64          ir_free;        /* free inode mask */
    1609             : } xfs_inobt_rec_t;
    1610             : 
    1611             : typedef struct xfs_inobt_rec_incore {
    1612             :         xfs_agino_t     ir_startino;    /* starting inode number */
    1613             :         uint16_t        ir_holemask;    /* hole mask for sparse chunks */
    1614             :         uint8_t         ir_count;       /* total inode count */
    1615             :         uint8_t         ir_freecount;   /* count of free inodes (set bits) */
    1616             :         xfs_inofree_t   ir_free;        /* free inode mask */
    1617             : } xfs_inobt_rec_incore_t;
    1618             : 
    1619             : static inline bool xfs_inobt_issparse(uint16_t holemask)
    1620             : {
    1621             :         /* non-zero holemask represents a sparse rec. */
    1622             :         return holemask;
    1623             : }
    1624             : 
    1625             : /*
    1626             :  * Key structure
    1627             :  */
    1628             : typedef struct xfs_inobt_key {
    1629             :         __be32          ir_startino;    /* starting inode number */
    1630             : } xfs_inobt_key_t;
    1631             : 
    1632             : /* btree pointer type */
    1633             : typedef __be32 xfs_inobt_ptr_t;
    1634             : 
    1635             : /*
    1636             :  * block numbers in the AG.
    1637             :  */
    1638             : #define XFS_IBT_BLOCK(mp)               ((xfs_agblock_t)(XFS_CNT_BLOCK(mp) + 1))
    1639             : #define XFS_FIBT_BLOCK(mp)              ((xfs_agblock_t)(XFS_IBT_BLOCK(mp) + 1))
    1640             : 
    1641             : /*
    1642             :  * Reverse mapping btree format definitions
    1643             :  *
    1644             :  * There is a btree for the reverse map per allocation group
    1645             :  */
    1646             : #define XFS_RMAP_CRC_MAGIC      0x524d4233      /* 'RMB3' */
    1647             : 
    1648             : /*
    1649             :  * Ownership info for an extent.  This is used to create reverse-mapping
    1650             :  * entries.
    1651             :  */
    1652             : #define XFS_OWNER_INFO_ATTR_FORK        (1 << 0)
    1653             : #define XFS_OWNER_INFO_BMBT_BLOCK       (1 << 1)
    1654             : struct xfs_owner_info {
    1655             :         uint64_t                oi_owner;
    1656             :         xfs_fileoff_t           oi_offset;
    1657             :         unsigned int            oi_flags;
    1658             : };
    1659             : 
    1660             : /*
    1661             :  * Special owner types.
    1662             :  *
    1663             :  * Seeing as we only support up to 8EB, we have the upper bit of the owner field
    1664             :  * to tell us we have a special owner value. We use these for static metadata
    1665             :  * allocated at mkfs/growfs time, as well as for freespace management metadata.
    1666             :  */
    1667             : #define XFS_RMAP_OWN_NULL       (-1ULL) /* No owner, for growfs */
    1668             : #define XFS_RMAP_OWN_UNKNOWN    (-2ULL) /* Unknown owner, for EFI recovery */
    1669             : #define XFS_RMAP_OWN_FS         (-3ULL) /* static fs metadata */
    1670             : #define XFS_RMAP_OWN_LOG        (-4ULL) /* static fs metadata */
    1671             : #define XFS_RMAP_OWN_AG         (-5ULL) /* AG freespace btree blocks */
    1672             : #define XFS_RMAP_OWN_INOBT      (-6ULL) /* Inode btree blocks */
    1673             : #define XFS_RMAP_OWN_INODES     (-7ULL) /* Inode chunk */
    1674             : #define XFS_RMAP_OWN_REFC       (-8ULL) /* refcount tree */
    1675             : #define XFS_RMAP_OWN_COW        (-9ULL) /* cow allocations */
    1676             : #define XFS_RMAP_OWN_MIN        (-10ULL) /* guard */
    1677             : 
    1678             : #define XFS_RMAP_NON_INODE_OWNER(owner) (!!((owner) & (1ULL << 63)))
    1679             : 
    1680             : /*
    1681             :  * Data record structure
    1682             :  */
    1683             : struct xfs_rmap_rec {
    1684             :         __be32          rm_startblock;  /* extent start block */
    1685             :         __be32          rm_blockcount;  /* extent length */
    1686             :         __be64          rm_owner;       /* extent owner */
    1687             :         __be64          rm_offset;      /* offset within the owner */
    1688             : };
    1689             : 
    1690             : /*
    1691             :  * rmap btree record
    1692             :  *  rm_offset:63 is the attribute fork flag
    1693             :  *  rm_offset:62 is the bmbt block flag
    1694             :  *  rm_offset:61 is the unwritten extent flag (same as l0:63 in bmbt)
    1695             :  *  rm_offset:54-60 aren't used and should be zero
    1696             :  *  rm_offset:0-53 is the block offset within the inode
    1697             :  */
    1698             : #define XFS_RMAP_OFF_ATTR_FORK  ((uint64_t)1ULL << 63)
    1699             : #define XFS_RMAP_OFF_BMBT_BLOCK ((uint64_t)1ULL << 62)
    1700             : #define XFS_RMAP_OFF_UNWRITTEN  ((uint64_t)1ULL << 61)
    1701             : 
    1702             : #define XFS_RMAP_LEN_MAX        ((uint32_t)~0U)
    1703             : #define XFS_RMAP_OFF_FLAGS      (XFS_RMAP_OFF_ATTR_FORK | \
    1704             :                                  XFS_RMAP_OFF_BMBT_BLOCK | \
    1705             :                                  XFS_RMAP_OFF_UNWRITTEN)
    1706             : #define XFS_RMAP_OFF_MASK       ((uint64_t)0x3FFFFFFFFFFFFFULL)
    1707             : 
    1708             : #define XFS_RMAP_OFF(off)               ((off) & XFS_RMAP_OFF_MASK)
    1709             : 
    1710             : #define XFS_RMAP_IS_BMBT_BLOCK(off)     (!!((off) & XFS_RMAP_OFF_BMBT_BLOCK))
    1711             : #define XFS_RMAP_IS_ATTR_FORK(off)      (!!((off) & XFS_RMAP_OFF_ATTR_FORK))
    1712             : #define XFS_RMAP_IS_UNWRITTEN(len)      (!!((off) & XFS_RMAP_OFF_UNWRITTEN))
    1713             : 
    1714             : #define RMAPBT_STARTBLOCK_BITLEN        32
    1715             : #define RMAPBT_BLOCKCOUNT_BITLEN        32
    1716             : #define RMAPBT_OWNER_BITLEN             64
    1717             : #define RMAPBT_ATTRFLAG_BITLEN          1
    1718             : #define RMAPBT_BMBTFLAG_BITLEN          1
    1719             : #define RMAPBT_EXNTFLAG_BITLEN          1
    1720             : #define RMAPBT_UNUSED_OFFSET_BITLEN     7
    1721             : #define RMAPBT_OFFSET_BITLEN            54
    1722             : 
    1723             : /*
    1724             :  * Key structure
    1725             :  *
    1726             :  * We don't use the length for lookups
    1727             :  */
    1728             : struct xfs_rmap_key {
    1729             :         __be32          rm_startblock;  /* extent start block */
    1730             :         __be64          rm_owner;       /* extent owner */
    1731             :         __be64          rm_offset;      /* offset within the owner */
    1732             : } __attribute__((packed));
    1733             : 
    1734             : /* btree pointer type */
    1735             : typedef __be32 xfs_rmap_ptr_t;
    1736             : 
    1737             : #define XFS_RMAP_BLOCK(mp) \
    1738             :         (xfs_has_finobt(((mp))) ? \
    1739             :          XFS_FIBT_BLOCK(mp) + 1 : \
    1740             :          XFS_IBT_BLOCK(mp) + 1)
    1741             : 
    1742             : /*
    1743             :  * Realtime Reverse mapping btree format definitions
    1744             :  *
    1745             :  * This is a btree for reverse mapping records for realtime volumes
    1746             :  */
    1747             : #define XFS_RTRMAP_CRC_MAGIC    0x4d415052      /* 'MAPR' */
    1748             : 
    1749             : /*
    1750             :  * rtrmap root header, on-disk form only.
    1751             :  */
    1752             : struct xfs_rtrmap_root {
    1753             :         __be16          bb_level;       /* 0 is a leaf */
    1754             :         __be16          bb_numrecs;     /* current # of data records */
    1755             : };
    1756             : 
    1757             : /* inode-based btree pointer type */
    1758             : typedef __be64 xfs_rtrmap_ptr_t;
    1759             : 
    1760             : /*
    1761             :  * Reference Count Btree format definitions
    1762             :  *
    1763             :  */
    1764             : #define XFS_REFC_CRC_MAGIC      0x52334643      /* 'R3FC' */
    1765             : 
    1766             : unsigned int xfs_refc_block(struct xfs_mount *mp);
    1767             : 
    1768             : /*
    1769             :  * Data record/key structure
    1770             :  *
    1771             :  * Each record associates a range of physical blocks (starting at
    1772             :  * rc_startblock and ending rc_blockcount blocks later) with a reference
    1773             :  * count (rc_refcount).  Extents that are being used to stage a copy on
    1774             :  * write (CoW) operation are recorded in the refcount btree with a
    1775             :  * refcount of 1.  All other records must have a refcount > 1 and must
    1776             :  * track an extent mapped only by file data forks.
    1777             :  *
    1778             :  * Extents with a single owner (attributes, metadata, non-shared file
    1779             :  * data) are not tracked here.  Free space is also not tracked here.
    1780             :  * This is consistent with pre-reflink XFS.
    1781             :  */
    1782             : 
    1783             : /*
    1784             :  * Extents that are being used to stage a copy on write are stored
    1785             :  * in the refcount btree with a refcount of 1 and the upper bit set
    1786             :  * on the startblock.  This speeds up mount time deletion of stale
    1787             :  * staging extents because they're all at the right side of the tree.
    1788             :  */
    1789             : #define XFS_REFC_COWFLAG                (1U << 31)
    1790             : #define REFCNTBT_COWFLAG_BITLEN         1
    1791             : #define REFCNTBT_AGBLOCK_BITLEN         31
    1792             : 
    1793             : struct xfs_refcount_rec {
    1794             :         __be32          rc_startblock;  /* starting block number */
    1795             :         __be32          rc_blockcount;  /* count of blocks */
    1796             :         __be32          rc_refcount;    /* number of inodes linked here */
    1797             : };
    1798             : 
    1799             : struct xfs_refcount_key {
    1800             :         __be32          rc_startblock;  /* starting block number */
    1801             : };
    1802             : 
    1803             : #define XFS_REFC_REFCOUNT_MAX   ((xfs_nlink_t)~0U)
    1804             : #define XFS_REFC_LEN_MAX        ((xfs_extlen_t)~0U)
    1805             : 
    1806             : /* btree pointer type */
    1807             : typedef __be32 xfs_refcount_ptr_t;
    1808             : 
    1809             : /*
    1810             :  * Realtime Reference Count btree format definitions
    1811             :  *
    1812             :  * This is a btree for reference count records for realtime volumes
    1813             :  */
    1814             : #define XFS_RTREFC_CRC_MAGIC    0x52434e54      /* 'RCNT' */
    1815             : 
    1816             : /*
    1817             :  * rt refcount root header, on-disk form only.
    1818             :  */
    1819             : struct xfs_rtrefcount_root {
    1820             :         __be16          bb_level;       /* 0 is a leaf */
    1821             :         __be16          bb_numrecs;     /* current # of data records */
    1822             : };
    1823             : 
    1824             : /* inode-rooted btree pointer type */
    1825             : typedef __be64 xfs_rtrefcount_ptr_t;
    1826             : 
    1827             : /*
    1828             :  * BMAP Btree format definitions
    1829             :  *
    1830             :  * This includes both the root block definition that sits inside an inode fork
    1831             :  * and the record/pointer formats for the leaf/node in the blocks.
    1832             :  */
    1833             : #define XFS_BMAP_MAGIC          0x424d4150      /* 'BMAP' */
    1834             : #define XFS_BMAP_CRC_MAGIC      0x424d4133      /* 'BMA3' */
    1835             : 
    1836             : /*
    1837             :  * Bmap root header, on-disk form only.
    1838             :  */
    1839             : typedef struct xfs_bmdr_block {
    1840             :         __be16          bb_level;       /* 0 is a leaf */
    1841             :         __be16          bb_numrecs;     /* current # of data records */
    1842             : } xfs_bmdr_block_t;
    1843             : 
    1844             : /*
    1845             :  * Bmap btree record and extent descriptor.
    1846             :  *  l0:63 is an extent flag (value 1 indicates non-normal).
    1847             :  *  l0:9-62 are startoff.
    1848             :  *  l0:0-8 and l1:21-63 are startblock.
    1849             :  *  l1:0-20 are blockcount.
    1850             :  */
    1851             : #define BMBT_EXNTFLAG_BITLEN    1
    1852             : #define BMBT_STARTOFF_BITLEN    54
    1853             : #define BMBT_STARTBLOCK_BITLEN  52
    1854             : #define BMBT_BLOCKCOUNT_BITLEN  21
    1855             : 
    1856             : #define BMBT_STARTOFF_MASK      ((1ULL << BMBT_STARTOFF_BITLEN) - 1)
    1857             : #define BMBT_BLOCKCOUNT_MASK    ((1ULL << BMBT_BLOCKCOUNT_BITLEN) - 1)
    1858             : 
    1859             : #define XFS_MAX_BMBT_EXTLEN     ((xfs_extlen_t)(BMBT_BLOCKCOUNT_MASK))
    1860             : 
    1861             : /*
    1862             :  * bmbt records have a file offset (block) field that is 54 bits wide, so this
    1863             :  * is the largest xfs_fileoff_t that we ever expect to see.
    1864             :  */
    1865             : #define XFS_MAX_FILEOFF         (BMBT_STARTOFF_MASK + BMBT_BLOCKCOUNT_MASK)
    1866             : 
    1867             : typedef struct xfs_bmbt_rec {
    1868             :         __be64                  l0, l1;
    1869             : } xfs_bmbt_rec_t;
    1870             : 
    1871             : typedef uint64_t        xfs_bmbt_rec_base_t;    /* use this for casts */
    1872             : typedef xfs_bmbt_rec_t xfs_bmdr_rec_t;
    1873             : 
    1874             : /*
    1875             :  * Values and macros for delayed-allocation startblock fields.
    1876             :  */
    1877             : #define STARTBLOCKVALBITS       17
    1878             : #define STARTBLOCKMASKBITS      (15 + 20)
    1879             : #define STARTBLOCKMASK          \
    1880             :         (((((xfs_fsblock_t)1) << STARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS)
    1881             : 
    1882             : static inline int isnullstartblock(xfs_fsblock_t x)
    1883             : {
    1884 13208922053 :         return ((x) & STARTBLOCKMASK) == STARTBLOCKMASK;
    1885             : }
    1886             : 
    1887    22712041 : static inline xfs_fsblock_t nullstartblock(int k)
    1888             : {
    1889    22712041 :         ASSERT(k < (1 << STARTBLOCKVALBITS));
    1890    22712041 :         return STARTBLOCKMASK | (k);
    1891             : }
    1892             : 
    1893             : static inline xfs_filblks_t startblockval(xfs_fsblock_t x)
    1894             : {
    1895    20874374 :         return (xfs_filblks_t)((x) & ~STARTBLOCKMASK);
    1896             : }
    1897             : 
    1898             : /*
    1899             :  * Key structure for non-leaf levels of the tree.
    1900             :  */
    1901             : typedef struct xfs_bmbt_key {
    1902             :         __be64          br_startoff;    /* starting file offset */
    1903             : } xfs_bmbt_key_t, xfs_bmdr_key_t;
    1904             : 
    1905             : /* btree pointer type */
    1906             : typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t;
    1907             : 
    1908             : 
    1909             : /*
    1910             :  * Generic Btree block format definitions
    1911             :  *
    1912             :  * This is a combination of the actual format used on disk for short and long
    1913             :  * format btrees.  The first three fields are shared by both format, but the
    1914             :  * pointers are different and should be used with care.
    1915             :  *
    1916             :  * To get the size of the actual short or long form headers please use the size
    1917             :  * macros below.  Never use sizeof(xfs_btree_block).
    1918             :  *
    1919             :  * The blkno, crc, lsn, owner and uuid fields are only available in filesystems
    1920             :  * with the crc feature bit, and all accesses to them must be conditional on
    1921             :  * that flag.
    1922             :  */
    1923             : /* short form block header */
    1924             : struct xfs_btree_block_shdr {
    1925             :         __be32          bb_leftsib;
    1926             :         __be32          bb_rightsib;
    1927             : 
    1928             :         __be64          bb_blkno;
    1929             :         __be64          bb_lsn;
    1930             :         uuid_t          bb_uuid;
    1931             :         __be32          bb_owner;
    1932             :         __le32          bb_crc;
    1933             : };
    1934             : 
    1935             : /* long form block header */
    1936             : struct xfs_btree_block_lhdr {
    1937             :         __be64          bb_leftsib;
    1938             :         __be64          bb_rightsib;
    1939             : 
    1940             :         __be64          bb_blkno;
    1941             :         __be64          bb_lsn;
    1942             :         uuid_t          bb_uuid;
    1943             :         __be64          bb_owner;
    1944             :         __le32          bb_crc;
    1945             :         __be32          bb_pad; /* padding for alignment */
    1946             : };
    1947             : 
    1948             : struct xfs_btree_block {
    1949             :         __be32          bb_magic;       /* magic number for block type */
    1950             :         __be16          bb_level;       /* 0 is a leaf */
    1951             :         __be16          bb_numrecs;     /* current # of data records */
    1952             :         union {
    1953             :                 struct xfs_btree_block_shdr s;
    1954             :                 struct xfs_btree_block_lhdr l;
    1955             :         } bb_u;                         /* rest */
    1956             : };
    1957             : 
    1958             : /* size of a short form block */
    1959             : #define XFS_BTREE_SBLOCK_LEN \
    1960             :         (offsetof(struct xfs_btree_block, bb_u) + \
    1961             :          offsetof(struct xfs_btree_block_shdr, bb_blkno))
    1962             : /* size of a long form block */
    1963             : #define XFS_BTREE_LBLOCK_LEN \
    1964             :         (offsetof(struct xfs_btree_block, bb_u) + \
    1965             :          offsetof(struct xfs_btree_block_lhdr, bb_blkno))
    1966             : 
    1967             : /* sizes of CRC enabled btree blocks */
    1968             : #define XFS_BTREE_SBLOCK_CRC_LEN \
    1969             :         (offsetof(struct xfs_btree_block, bb_u) + \
    1970             :          sizeof(struct xfs_btree_block_shdr))
    1971             : #define XFS_BTREE_LBLOCK_CRC_LEN \
    1972             :         (offsetof(struct xfs_btree_block, bb_u) + \
    1973             :          sizeof(struct xfs_btree_block_lhdr))
    1974             : 
    1975             : #define XFS_BTREE_SBLOCK_CRC_OFF \
    1976             :         offsetof(struct xfs_btree_block, bb_u.s.bb_crc)
    1977             : #define XFS_BTREE_LBLOCK_CRC_OFF \
    1978             :         offsetof(struct xfs_btree_block, bb_u.l.bb_crc)
    1979             : 
    1980             : /*
    1981             :  * On-disk XFS access control list structure.
    1982             :  */
    1983             : struct xfs_acl_entry {
    1984             :         __be32  ae_tag;
    1985             :         __be32  ae_id;
    1986             :         __be16  ae_perm;
    1987             :         __be16  ae_pad;         /* fill the implicit hole in the structure */
    1988             : };
    1989             : 
    1990             : struct xfs_acl {
    1991             :         __be32                  acl_cnt;
    1992             :         struct xfs_acl_entry    acl_entry[];
    1993             : };
    1994             : 
    1995             : /*
    1996             :  * The number of ACL entries allowed is defined by the on-disk format.
    1997             :  * For v4 superblocks, that is limited to 25 entries. For v5 superblocks, it is
    1998             :  * limited only by the maximum size of the xattr that stores the information.
    1999             :  */
    2000             : #define XFS_ACL_MAX_ENTRIES(mp) \
    2001             :         (xfs_has_crc(mp) \
    2002             :                 ?  (XFS_XATTR_SIZE_MAX - sizeof(struct xfs_acl)) / \
    2003             :                                                 sizeof(struct xfs_acl_entry) \
    2004             :                 : 25)
    2005             : 
    2006             : #define XFS_ACL_SIZE(cnt) \
    2007             :         (sizeof(struct xfs_acl) + \
    2008             :                 sizeof(struct xfs_acl_entry) * cnt)
    2009             : 
    2010             : #define XFS_ACL_MAX_SIZE(mp) \
    2011             :         XFS_ACL_SIZE(XFS_ACL_MAX_ENTRIES((mp)))
    2012             : 
    2013             : 
    2014             : /* On-disk XFS extended attribute names */
    2015             : #define SGI_ACL_FILE            "SGI_ACL_FILE"
    2016             : #define SGI_ACL_DEFAULT         "SGI_ACL_DEFAULT"
    2017             : #define SGI_ACL_FILE_SIZE       (sizeof(SGI_ACL_FILE)-1)
    2018             : #define SGI_ACL_DEFAULT_SIZE    (sizeof(SGI_ACL_DEFAULT)-1)
    2019             : 
    2020             : #endif /* __XFS_FORMAT_H__ */

Generated by: LCOV version 1.14