LCOV - code coverage report
Current view: top level - fs/xfs/libxfs - xfs_log_format.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc3-djwx @ Mon Jul 31 20:08:22 PDT 2023 Lines: 23 23 100.0 %
Date: 2023-07-31 20:08:22 Functions: 1 1 100.0 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0
       2             : /*
       3             :  * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
       4             :  * All Rights Reserved.
       5             :  */
       6             : #ifndef __XFS_LOG_FORMAT_H__
       7             : #define __XFS_LOG_FORMAT_H__
       8             : 
       9             : struct xfs_mount;
      10             : struct xfs_trans_res;
      11             : 
      12             : /*
      13             :  * On-disk Log Format definitions.
      14             :  *
      15             :  * This file contains all the on-disk format definitions used within the log. It
      16             :  * includes the physical log structure itself, as well as all the log item
      17             :  * format structures that are written into the log and intepreted by log
      18             :  * recovery. We start with the physical log format definitions, and then work
      19             :  * through all the log items definitions and everything they encode into the
      20             :  * log.
      21             :  */
      22             : typedef uint32_t xlog_tid_t;
      23             : 
      24             : #define XLOG_MIN_ICLOGS         2
      25             : #define XLOG_MAX_ICLOGS         8
      26             : #define XLOG_HEADER_MAGIC_NUM   0xFEEDbabe      /* Invalid cycle number */
      27             : #define XLOG_VERSION_1          1
      28             : #define XLOG_VERSION_2          2               /* Large IClogs, Log sunit */
      29             : #define XLOG_VERSION_OKBITS     (XLOG_VERSION_1 | XLOG_VERSION_2)
      30             : #define XLOG_MIN_RECORD_BSIZE   (16*1024)       /* eventually 32k */
      31             : #define XLOG_BIG_RECORD_BSIZE   (32*1024)       /* 32k buffers */
      32             : #define XLOG_MAX_RECORD_BSIZE   (256*1024)
      33             : #define XLOG_HEADER_CYCLE_SIZE  (32*1024)       /* cycle data in header */
      34             : #define XLOG_MIN_RECORD_BSHIFT  14              /* 16384 == 1 << 14 */
      35             : #define XLOG_BIG_RECORD_BSHIFT  15              /* 32k == 1 << 15 */
      36             : #define XLOG_MAX_RECORD_BSHIFT  18              /* 256k == 1 << 18 */
      37             : 
      38             : #define XLOG_HEADER_SIZE        512
      39             : 
      40             : /* Minimum number of transactions that must fit in the log (defined by mkfs) */
      41             : #define XFS_MIN_LOG_FACTOR      3
      42             : 
      43             : #define XLOG_REC_SHIFT(log) \
      44             :         BTOBB(1 << (xfs_has_logv2(log->l_mp) ? \
      45             :          XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT))
      46             : #define XLOG_TOTAL_REC_SHIFT(log) \
      47             :         BTOBB(XLOG_MAX_ICLOGS << (xfs_has_logv2(log->l_mp) ? \
      48             :          XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT))
      49             : 
      50             : /* get lsn fields */
      51             : #define CYCLE_LSN(lsn) ((uint)((lsn)>>32))
      52             : #define BLOCK_LSN(lsn) ((uint)(lsn))
      53             : 
      54             : /* this is used in a spot where we might otherwise double-endian-flip */
      55             : #define CYCLE_LSN_DISK(lsn) (((__be32 *)&(lsn))[0])
      56             : 
      57             : static inline xfs_lsn_t xlog_assign_lsn(uint cycle, uint block)
      58             : {
      59   283935791 :         return ((xfs_lsn_t)cycle << 32) | block;
      60             : }
      61             : 
      62             : static inline uint xlog_get_cycle(char *ptr)
      63             : {
      64   120717224 :         if (be32_to_cpu(*(__be32 *)ptr) == XLOG_HEADER_MAGIC_NUM)
      65     6604431 :                 return be32_to_cpu(*((__be32 *)ptr + 1));
      66             :         else
      67             :                 return be32_to_cpu(*(__be32 *)ptr);
      68             : }
      69             : 
      70             : /* Log Clients */
      71             : #define XFS_TRANSACTION         0x69
      72             : #define XFS_LOG                 0xaa
      73             : 
      74             : #define XLOG_UNMOUNT_TYPE       0x556e  /* Un for Unmount */
      75             : 
      76             : /*
      77             :  * Log item for unmount records.
      78             :  *
      79             :  * The unmount record used to have a string "Unmount filesystem--" in the
      80             :  * data section where the "Un" was really a magic number (XLOG_UNMOUNT_TYPE).
      81             :  * We just write the magic number now; see xfs_log_unmount_write.
      82             :  */
      83             : struct xfs_unmount_log_format {
      84             :         uint16_t        magic;  /* XLOG_UNMOUNT_TYPE */
      85             :         uint16_t        pad1;
      86             :         uint32_t        pad2;   /* may as well make it 64 bits */
      87             : };
      88             : 
      89             : /* Region types for iovec's i_type */
      90             : #define XLOG_REG_TYPE_BFORMAT           1
      91             : #define XLOG_REG_TYPE_BCHUNK            2
      92             : #define XLOG_REG_TYPE_EFI_FORMAT        3
      93             : #define XLOG_REG_TYPE_EFD_FORMAT        4
      94             : #define XLOG_REG_TYPE_IFORMAT           5
      95             : #define XLOG_REG_TYPE_ICORE             6
      96             : #define XLOG_REG_TYPE_IEXT              7
      97             : #define XLOG_REG_TYPE_IBROOT            8
      98             : #define XLOG_REG_TYPE_ILOCAL            9
      99             : #define XLOG_REG_TYPE_IATTR_EXT         10
     100             : #define XLOG_REG_TYPE_IATTR_BROOT       11
     101             : #define XLOG_REG_TYPE_IATTR_LOCAL       12
     102             : #define XLOG_REG_TYPE_QFORMAT           13
     103             : #define XLOG_REG_TYPE_DQUOT             14
     104             : #define XLOG_REG_TYPE_QUOTAOFF          15
     105             : #define XLOG_REG_TYPE_LRHEADER          16
     106             : #define XLOG_REG_TYPE_UNMOUNT           17
     107             : #define XLOG_REG_TYPE_COMMIT            18
     108             : #define XLOG_REG_TYPE_TRANSHDR          19
     109             : #define XLOG_REG_TYPE_ICREATE           20
     110             : #define XLOG_REG_TYPE_RUI_FORMAT        21
     111             : #define XLOG_REG_TYPE_RUD_FORMAT        22
     112             : #define XLOG_REG_TYPE_CUI_FORMAT        23
     113             : #define XLOG_REG_TYPE_CUD_FORMAT        24
     114             : #define XLOG_REG_TYPE_BUI_FORMAT        25
     115             : #define XLOG_REG_TYPE_BUD_FORMAT        26
     116             : #define XLOG_REG_TYPE_ATTRI_FORMAT      27
     117             : #define XLOG_REG_TYPE_ATTRD_FORMAT      28
     118             : #define XLOG_REG_TYPE_ATTR_NAME 29
     119             : #define XLOG_REG_TYPE_ATTR_VALUE        30
     120             : #define XLOG_REG_TYPE_MAX               30
     121             : 
     122             : 
     123             : /*
     124             :  * Flags to log operation header
     125             :  *
     126             :  * The first write of a new transaction will be preceded with a start
     127             :  * record, XLOG_START_TRANS.  Once a transaction is committed, a commit
     128             :  * record is written, XLOG_COMMIT_TRANS.  If a single region can not fit into
     129             :  * the remainder of the current active in-core log, it is split up into
     130             :  * multiple regions.  Each partial region will be marked with a
     131             :  * XLOG_CONTINUE_TRANS until the last one, which gets marked with XLOG_END_TRANS.
     132             :  *
     133             :  */
     134             : #define XLOG_START_TRANS        0x01    /* Start a new transaction */
     135             : #define XLOG_COMMIT_TRANS       0x02    /* Commit this transaction */
     136             : #define XLOG_CONTINUE_TRANS     0x04    /* Cont this trans into new region */
     137             : #define XLOG_WAS_CONT_TRANS     0x08    /* Cont this trans into new region */
     138             : #define XLOG_END_TRANS          0x10    /* End a continued transaction */
     139             : #define XLOG_UNMOUNT_TRANS      0x20    /* Unmount a filesystem transaction */
     140             : 
     141             : 
     142             : typedef struct xlog_op_header {
     143             :         __be32     oh_tid;      /* transaction id of operation  :  4 b */
     144             :         __be32     oh_len;      /* bytes in data region         :  4 b */
     145             :         __u8       oh_clientid; /* who sent me this             :  1 b */
     146             :         __u8       oh_flags;    /*                              :  1 b */
     147             :         __u16      oh_res2;     /* 32 bit align                 :  2 b */
     148             : } xlog_op_header_t;
     149             : 
     150             : /* valid values for h_fmt */
     151             : #define XLOG_FMT_UNKNOWN  0
     152             : #define XLOG_FMT_LINUX_LE 1
     153             : #define XLOG_FMT_LINUX_BE 2
     154             : #define XLOG_FMT_IRIX_BE  3
     155             : 
     156             : /* our fmt */
     157             : #ifdef XFS_NATIVE_HOST
     158             : #define XLOG_FMT XLOG_FMT_LINUX_BE
     159             : #else
     160             : #define XLOG_FMT XLOG_FMT_LINUX_LE
     161             : #endif
     162             : 
     163             : typedef struct xlog_rec_header {
     164             :         __be32    h_magicno;    /* log record (LR) identifier           :  4 */
     165             :         __be32    h_cycle;      /* write cycle of log                   :  4 */
     166             :         __be32    h_version;    /* LR version                           :  4 */
     167             :         __be32    h_len;        /* len in bytes; should be 64-bit aligned: 4 */
     168             :         __be64    h_lsn;        /* lsn of this LR                       :  8 */
     169             :         __be64    h_tail_lsn;   /* lsn of 1st LR w/ buffers not committed: 8 */
     170             :         __le32    h_crc;        /* crc of log record                    :  4 */
     171             :         __be32    h_prev_block; /* block number to previous LR          :  4 */
     172             :         __be32    h_num_logops; /* number of log operations in this LR  :  4 */
     173             :         __be32    h_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE];
     174             :         /* new fields */
     175             :         __be32    h_fmt;        /* format of log record                 :  4 */
     176             :         uuid_t    h_fs_uuid;    /* uuid of FS                           : 16 */
     177             :         __be32    h_size;       /* iclog size                           :  4 */
     178             : } xlog_rec_header_t;
     179             : 
     180             : typedef struct xlog_rec_ext_header {
     181             :         __be32    xh_cycle;     /* write cycle of log                   : 4 */
     182             :         __be32    xh_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE]; /*    : 256 */
     183             : } xlog_rec_ext_header_t;
     184             : 
     185             : /*
     186             :  * Quite misnamed, because this union lays out the actual on-disk log buffer.
     187             :  */
     188             : typedef union xlog_in_core2 {
     189             :         xlog_rec_header_t       hic_header;
     190             :         xlog_rec_ext_header_t   hic_xheader;
     191             :         char                    hic_sector[XLOG_HEADER_SIZE];
     192             : } xlog_in_core_2_t;
     193             : 
     194             : /* not an on-disk structure, but needed by log recovery in userspace */
     195             : typedef struct xfs_log_iovec {
     196             :         void            *i_addr;        /* beginning address of region */
     197             :         int             i_len;          /* length in bytes of region */
     198             :         uint            i_type;         /* type of region */
     199             : } xfs_log_iovec_t;
     200             : 
     201             : 
     202             : /*
     203             :  * Transaction Header definitions.
     204             :  *
     205             :  * This is the structure written in the log at the head of every transaction. It
     206             :  * identifies the type and id of the transaction, and contains the number of
     207             :  * items logged by the transaction so we know how many to expect during
     208             :  * recovery.
     209             :  *
     210             :  * Do not change the below structure without redoing the code in
     211             :  * xlog_recover_add_to_trans() and xlog_recover_add_to_cont_trans().
     212             :  */
     213             : typedef struct xfs_trans_header {
     214             :         uint            th_magic;               /* magic number */
     215             :         uint            th_type;                /* transaction type */
     216             :         int32_t         th_tid;                 /* transaction id (unused) */
     217             :         uint            th_num_items;           /* num items logged by trans */
     218             : } xfs_trans_header_t;
     219             : 
     220             : #define XFS_TRANS_HEADER_MAGIC  0x5452414e      /* TRAN */
     221             : 
     222             : /*
     223             :  * The only type valid for th_type in CIL-enabled file system logs:
     224             :  */
     225             : #define XFS_TRANS_CHECKPOINT    40
     226             : 
     227             : /*
     228             :  * Log item types.
     229             :  */
     230             : #define XFS_LI_EFI              0x1236
     231             : #define XFS_LI_EFD              0x1237
     232             : #define XFS_LI_IUNLINK          0x1238
     233             : #define XFS_LI_INODE            0x123b  /* aligned ino chunks, var-size ibufs */
     234             : #define XFS_LI_BUF              0x123c  /* v2 bufs, variable sized inode bufs */
     235             : #define XFS_LI_DQUOT            0x123d
     236             : #define XFS_LI_QUOTAOFF         0x123e
     237             : #define XFS_LI_ICREATE          0x123f
     238             : #define XFS_LI_RUI              0x1240  /* rmap update intent */
     239             : #define XFS_LI_RUD              0x1241
     240             : #define XFS_LI_CUI              0x1242  /* refcount update intent */
     241             : #define XFS_LI_CUD              0x1243
     242             : #define XFS_LI_BUI              0x1244  /* bmbt update intent */
     243             : #define XFS_LI_BUD              0x1245
     244             : #define XFS_LI_ATTRI            0x1246  /* attr set/remove intent*/
     245             : #define XFS_LI_ATTRD            0x1247  /* attr set/remove done */
     246             : 
     247             : #define XFS_LI_TYPE_DESC \
     248             :         { XFS_LI_EFI,           "XFS_LI_EFI" }, \
     249             :         { XFS_LI_EFD,           "XFS_LI_EFD" }, \
     250             :         { XFS_LI_IUNLINK,       "XFS_LI_IUNLINK" }, \
     251             :         { XFS_LI_INODE,         "XFS_LI_INODE" }, \
     252             :         { XFS_LI_BUF,           "XFS_LI_BUF" }, \
     253             :         { XFS_LI_DQUOT,         "XFS_LI_DQUOT" }, \
     254             :         { XFS_LI_QUOTAOFF,      "XFS_LI_QUOTAOFF" }, \
     255             :         { XFS_LI_ICREATE,       "XFS_LI_ICREATE" }, \
     256             :         { XFS_LI_RUI,           "XFS_LI_RUI" }, \
     257             :         { XFS_LI_RUD,           "XFS_LI_RUD" }, \
     258             :         { XFS_LI_CUI,           "XFS_LI_CUI" }, \
     259             :         { XFS_LI_CUD,           "XFS_LI_CUD" }, \
     260             :         { XFS_LI_BUI,           "XFS_LI_BUI" }, \
     261             :         { XFS_LI_BUD,           "XFS_LI_BUD" }, \
     262             :         { XFS_LI_ATTRI,         "XFS_LI_ATTRI" }, \
     263             :         { XFS_LI_ATTRD,         "XFS_LI_ATTRD" }
     264             : 
     265             : /*
     266             :  * Inode Log Item Format definitions.
     267             :  *
     268             :  * This is the structure used to lay out an inode log item in the
     269             :  * log.  The size of the inline data/extents/b-tree root to be logged
     270             :  * (if any) is indicated in the ilf_dsize field.  Changes to this structure
     271             :  * must be added on to the end.
     272             :  */
     273             : struct xfs_inode_log_format {
     274             :         uint16_t                ilf_type;       /* inode log item type */
     275             :         uint16_t                ilf_size;       /* size of this item */
     276             :         uint32_t                ilf_fields;     /* flags for fields logged */
     277             :         uint16_t                ilf_asize;      /* size of attr d/ext/root */
     278             :         uint16_t                ilf_dsize;      /* size of data/ext/root */
     279             :         uint32_t                ilf_pad;        /* pad for 64 bit boundary */
     280             :         uint64_t                ilf_ino;        /* inode number */
     281             :         union {
     282             :                 uint32_t        ilfu_rdev;      /* rdev value for dev inode*/
     283             :                 uint8_t         __pad[16];      /* unused */
     284             :         } ilf_u;
     285             :         int64_t                 ilf_blkno;      /* blkno of inode buffer */
     286             :         int32_t                 ilf_len;        /* len of inode buffer */
     287             :         int32_t                 ilf_boffset;    /* off of inode in buffer */
     288             : };
     289             : 
     290             : /*
     291             :  * Old 32 bit systems will log in this format without the 64 bit
     292             :  * alignment padding. Recovery will detect this and convert it to the
     293             :  * correct format.
     294             :  */
     295             : struct xfs_inode_log_format_32 {
     296             :         uint16_t                ilf_type;       /* inode log item type */
     297             :         uint16_t                ilf_size;       /* size of this item */
     298             :         uint32_t                ilf_fields;     /* flags for fields logged */
     299             :         uint16_t                ilf_asize;      /* size of attr d/ext/root */
     300             :         uint16_t                ilf_dsize;      /* size of data/ext/root */
     301             :         uint64_t                ilf_ino;        /* inode number */
     302             :         union {
     303             :                 uint32_t        ilfu_rdev;      /* rdev value for dev inode*/
     304             :                 uint8_t         __pad[16];      /* unused */
     305             :         } ilf_u;
     306             :         int64_t                 ilf_blkno;      /* blkno of inode buffer */
     307             :         int32_t                 ilf_len;        /* len of inode buffer */
     308             :         int32_t                 ilf_boffset;    /* off of inode in buffer */
     309             : } __attribute__((packed));
     310             : 
     311             : 
     312             : /*
     313             :  * Flags for xfs_trans_log_inode flags field.
     314             :  */
     315             : #define XFS_ILOG_CORE   0x001   /* log standard inode fields */
     316             : #define XFS_ILOG_DDATA  0x002   /* log i_df.if_data */
     317             : #define XFS_ILOG_DEXT   0x004   /* log i_df.if_extents */
     318             : #define XFS_ILOG_DBROOT 0x008   /* log i_df.i_broot */
     319             : #define XFS_ILOG_DEV    0x010   /* log the dev field */
     320             : #define XFS_ILOG_UUID   0x020   /* added long ago, but never used */
     321             : #define XFS_ILOG_ADATA  0x040   /* log i_af.if_data */
     322             : #define XFS_ILOG_AEXT   0x080   /* log i_af.if_extents */
     323             : #define XFS_ILOG_ABROOT 0x100   /* log i_af.i_broot */
     324             : #define XFS_ILOG_DOWNER 0x200   /* change the data fork owner on replay */
     325             : #define XFS_ILOG_AOWNER 0x400   /* change the attr fork owner on replay */
     326             : 
     327             : /*
     328             :  * The timestamps are dirty, but not necessarily anything else in the inode
     329             :  * core.  Unlike the other fields above this one must never make it to disk
     330             :  * in the ilf_fields of the inode_log_format, but is purely store in-memory in
     331             :  * ili_fields in the inode_log_item.
     332             :  */
     333             : #define XFS_ILOG_TIMESTAMP      0x4000
     334             : 
     335             : /*
     336             :  * The version field has been changed, but not necessarily anything else of
     337             :  * interest. This must never make it to disk - it is used purely to ensure that
     338             :  * the inode item ->precommit operation can update the fsync flag triggers
     339             :  * in the inode item correctly.
     340             :  */
     341             : #define XFS_ILOG_IVERSION       0x8000
     342             : 
     343             : #define XFS_ILOG_NONCORE        (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \
     344             :                                  XFS_ILOG_DBROOT | XFS_ILOG_DEV | \
     345             :                                  XFS_ILOG_ADATA | XFS_ILOG_AEXT | \
     346             :                                  XFS_ILOG_ABROOT | XFS_ILOG_DOWNER | \
     347             :                                  XFS_ILOG_AOWNER)
     348             : 
     349             : #define XFS_ILOG_DFORK          (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \
     350             :                                  XFS_ILOG_DBROOT)
     351             : 
     352             : #define XFS_ILOG_AFORK          (XFS_ILOG_ADATA | XFS_ILOG_AEXT | \
     353             :                                  XFS_ILOG_ABROOT)
     354             : 
     355             : #define XFS_ILOG_ALL            (XFS_ILOG_CORE | XFS_ILOG_DDATA | \
     356             :                                  XFS_ILOG_DEXT | XFS_ILOG_DBROOT | \
     357             :                                  XFS_ILOG_DEV | XFS_ILOG_ADATA | \
     358             :                                  XFS_ILOG_AEXT | XFS_ILOG_ABROOT | \
     359             :                                  XFS_ILOG_TIMESTAMP | XFS_ILOG_DOWNER | \
     360             :                                  XFS_ILOG_AOWNER)
     361             : 
     362             : static inline int xfs_ilog_fbroot(int w)
     363             : {
     364   332280636 :         return (w == XFS_DATA_FORK ? XFS_ILOG_DBROOT : XFS_ILOG_ABROOT);
     365             : }
     366             : 
     367             : static inline int xfs_ilog_fext(int w)
     368             : {
     369   472699747 :         return (w == XFS_DATA_FORK ? XFS_ILOG_DEXT : XFS_ILOG_AEXT);
     370             : }
     371             : 
     372             : static inline int xfs_ilog_fdata(int w)
     373             : {
     374             :         return (w == XFS_DATA_FORK ? XFS_ILOG_DDATA : XFS_ILOG_ADATA);
     375             : }
     376             : 
     377             : /*
     378             :  * Incore version of the on-disk inode core structures. We log this directly
     379             :  * into the journal in host CPU format (for better or worse) and as such
     380             :  * directly mirrors the xfs_dinode structure as it must contain all the same
     381             :  * information.
     382             :  */
     383             : typedef uint64_t xfs_log_timestamp_t;
     384             : 
     385             : /* Legacy timestamp encoding format. */
     386             : struct xfs_log_legacy_timestamp {
     387             :         int32_t         t_sec;          /* timestamp seconds */
     388             :         int32_t         t_nsec;         /* timestamp nanoseconds */
     389             : };
     390             : 
     391             : /*
     392             :  * Define the format of the inode core that is logged. This structure must be
     393             :  * kept identical to struct xfs_dinode except for the endianness annotations.
     394             :  */
     395             : struct xfs_log_dinode {
     396             :         uint16_t        di_magic;       /* inode magic # = XFS_DINODE_MAGIC */
     397             :         uint16_t        di_mode;        /* mode and type of file */
     398             :         int8_t          di_version;     /* inode version */
     399             :         int8_t          di_format;      /* format of di_c data */
     400             :         uint8_t         di_pad3[2];     /* unused in v2/3 inodes */
     401             :         uint32_t        di_uid;         /* owner's user id */
     402             :         uint32_t        di_gid;         /* owner's group id */
     403             :         uint32_t        di_nlink;       /* number of links to file */
     404             :         uint16_t        di_projid_lo;   /* lower part of owner's project id */
     405             :         uint16_t        di_projid_hi;   /* higher part of owner's project id */
     406             :         union {
     407             :                 /* Number of data fork extents if NREXT64 is set */
     408             :                 uint64_t        di_big_nextents;
     409             : 
     410             :                 /* Padding for V3 inodes without NREXT64 set. */
     411             :                 uint64_t        di_v3_pad;
     412             : 
     413             :                 /* Padding and inode flush counter for V2 inodes. */
     414             :                 struct {
     415             :                         uint8_t di_v2_pad[6];   /* V2 inode zeroed space */
     416             :                         uint16_t di_flushiter;  /* V2 inode incremented on flush */
     417             :                 };
     418             :         };
     419             :         xfs_log_timestamp_t di_atime;   /* time last accessed */
     420             :         xfs_log_timestamp_t di_mtime;   /* time last modified */
     421             :         xfs_log_timestamp_t di_ctime;   /* time created/inode modified */
     422             :         xfs_fsize_t     di_size;        /* number of bytes in file */
     423             :         xfs_rfsblock_t  di_nblocks;     /* # of direct & btree blocks used */
     424             :         xfs_extlen_t    di_extsize;     /* basic/minimum extent size for file */
     425             :         union {
     426             :                 /*
     427             :                  * For V2 inodes and V3 inodes without NREXT64 set, this
     428             :                  * is the number of data and attr fork extents.
     429             :                  */
     430             :                 struct {
     431             :                         uint32_t  di_nextents;
     432             :                         uint16_t  di_anextents;
     433             :                 } __packed;
     434             : 
     435             :                 /* Number of attr fork extents if NREXT64 is set. */
     436             :                 struct {
     437             :                         uint32_t  di_big_anextents;
     438             :                         uint16_t  di_nrext64_pad;
     439             :                 } __packed;
     440             :         } __packed;
     441             :         uint8_t         di_forkoff;     /* attr fork offs, <<3 for 64b align */
     442             :         int8_t          di_aformat;     /* format of attr fork's data */
     443             :         uint32_t        di_dmevmask;    /* DMIG event mask */
     444             :         uint16_t        di_dmstate;     /* DMIG state info */
     445             :         uint16_t        di_flags;       /* random flags, XFS_DIFLAG_... */
     446             :         uint32_t        di_gen;         /* generation number */
     447             : 
     448             :         /* di_next_unlinked is the only non-core field in the old dinode */
     449             :         xfs_agino_t     di_next_unlinked;/* agi unlinked list ptr */
     450             : 
     451             :         /* start of the extended dinode, writable fields */
     452             :         uint32_t        di_crc;         /* CRC of the inode */
     453             :         uint64_t        di_changecount; /* number of attribute changes */
     454             : 
     455             :         /*
     456             :          * The LSN we write to this field during formatting is not a reflection
     457             :          * of the current on-disk LSN. It should never be used for recovery
     458             :          * sequencing, nor should it be recovered into the on-disk inode at all.
     459             :          * See xlog_recover_inode_commit_pass2() and xfs_log_dinode_to_disk()
     460             :          * for details.
     461             :          */
     462             :         xfs_lsn_t       di_lsn;
     463             : 
     464             :         uint64_t        di_flags2;      /* more random flags */
     465             :         uint32_t        di_cowextsize;  /* basic cow extent size for file */
     466             :         uint8_t         di_pad2[12];    /* more padding for future expansion */
     467             : 
     468             :         /* fields only written to during inode creation */
     469             :         xfs_log_timestamp_t di_crtime;  /* time created */
     470             :         xfs_ino_t       di_ino;         /* inode number */
     471             :         uuid_t          di_uuid;        /* UUID of the filesystem */
     472             : 
     473             :         /* structure must be padded to 64 bit alignment */
     474             : };
     475             : 
     476             : #define xfs_log_dinode_size(mp)                                         \
     477             :         (xfs_has_v3inodes((mp)) ?                                       \
     478             :                 sizeof(struct xfs_log_dinode) :                         \
     479             :                 offsetof(struct xfs_log_dinode, di_next_unlinked))
     480             : 
     481             : /*
     482             :  * Buffer Log Format definitions
     483             :  *
     484             :  * These are the physical dirty bitmap definitions for the log format structure.
     485             :  */
     486             : #define XFS_BLF_CHUNK           128
     487             : #define XFS_BLF_SHIFT           7
     488             : #define BIT_TO_WORD_SHIFT       5
     489             : #define NBWORD                  (NBBY * sizeof(unsigned int))
     490             : 
     491             : /*
     492             :  * This flag indicates that the buffer contains on disk inodes
     493             :  * and requires special recovery handling.
     494             :  */
     495             : #define XFS_BLF_INODE_BUF       (1<<0)
     496             : 
     497             : /*
     498             :  * This flag indicates that the buffer should not be replayed
     499             :  * during recovery because its blocks are being freed.
     500             :  */
     501             : #define XFS_BLF_CANCEL          (1<<1)
     502             : 
     503             : /*
     504             :  * This flag indicates that the buffer contains on disk
     505             :  * user or group dquots and may require special recovery handling.
     506             :  */
     507             : #define XFS_BLF_UDQUOT_BUF      (1<<2)
     508             : #define XFS_BLF_PDQUOT_BUF      (1<<3)
     509             : #define XFS_BLF_GDQUOT_BUF      (1<<4)
     510             : 
     511             : /*
     512             :  * This is the structure used to lay out a buf log item in the log.  The data
     513             :  * map describes which 128 byte chunks of the buffer have been logged.
     514             :  *
     515             :  * The placement of blf_map_size causes blf_data_map to start at an odd
     516             :  * multiple of sizeof(unsigned int) offset within the struct.  Because the data
     517             :  * bitmap size will always be an even number, the end of the data_map (and
     518             :  * therefore the structure) will also be at an odd multiple of sizeof(unsigned
     519             :  * int).  Some 64-bit compilers will insert padding at the end of the struct to
     520             :  * ensure 64-bit alignment of blf_blkno, but 32-bit ones will not.  Therefore,
     521             :  * XFS_BLF_DATAMAP_SIZE must be an odd number to make the padding explicit and
     522             :  * keep the structure size consistent between 32-bit and 64-bit platforms.
     523             :  */
     524             : #define __XFS_BLF_DATAMAP_SIZE  ((XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK) / NBWORD)
     525             : #define XFS_BLF_DATAMAP_SIZE    (__XFS_BLF_DATAMAP_SIZE + 1)
     526             : 
     527             : typedef struct xfs_buf_log_format {
     528             :         unsigned short  blf_type;       /* buf log item type indicator */
     529             :         unsigned short  blf_size;       /* size of this item */
     530             :         unsigned short  blf_flags;      /* misc state */
     531             :         unsigned short  blf_len;        /* number of blocks in this buf */
     532             :         int64_t         blf_blkno;      /* starting blkno of this buf */
     533             :         unsigned int    blf_map_size;   /* used size of data bitmap in words */
     534             :         unsigned int    blf_data_map[XFS_BLF_DATAMAP_SIZE]; /* dirty bitmap */
     535             : } xfs_buf_log_format_t;
     536             : 
     537             : /*
     538             :  * All buffers now need to tell recovery where the magic number
     539             :  * is so that it can verify and calculate the CRCs on the buffer correctly
     540             :  * once the changes have been replayed into the buffer.
     541             :  *
     542             :  * The type value is held in the upper 5 bits of the blf_flags field, which is
     543             :  * an unsigned 16 bit field. Hence we need to shift it 11 bits up and down.
     544             :  */
     545             : #define XFS_BLFT_BITS   5
     546             : #define XFS_BLFT_SHIFT  11
     547             : #define XFS_BLFT_MASK   (((1 << XFS_BLFT_BITS) - 1) << XFS_BLFT_SHIFT)
     548             : 
     549             : enum xfs_blft {
     550             :         XFS_BLFT_UNKNOWN_BUF = 0,
     551             :         XFS_BLFT_UDQUOT_BUF,
     552             :         XFS_BLFT_PDQUOT_BUF,
     553             :         XFS_BLFT_GDQUOT_BUF,
     554             :         XFS_BLFT_BTREE_BUF,
     555             :         XFS_BLFT_AGF_BUF,
     556             :         XFS_BLFT_AGFL_BUF,
     557             :         XFS_BLFT_AGI_BUF,
     558             :         XFS_BLFT_DINO_BUF,
     559             :         XFS_BLFT_SYMLINK_BUF,
     560             :         XFS_BLFT_DIR_BLOCK_BUF,
     561             :         XFS_BLFT_DIR_DATA_BUF,
     562             :         XFS_BLFT_DIR_FREE_BUF,
     563             :         XFS_BLFT_DIR_LEAF1_BUF,
     564             :         XFS_BLFT_DIR_LEAFN_BUF,
     565             :         XFS_BLFT_DA_NODE_BUF,
     566             :         XFS_BLFT_ATTR_LEAF_BUF,
     567             :         XFS_BLFT_ATTR_RMT_BUF,
     568             :         XFS_BLFT_SB_BUF,
     569             :         XFS_BLFT_RTBITMAP_BUF,
     570             :         XFS_BLFT_RTSUMMARY_BUF,
     571             :         XFS_BLFT_MAX_BUF = (1 << XFS_BLFT_BITS),
     572             : };
     573             : 
     574             : static inline void
     575 10299530439 : xfs_blft_to_flags(struct xfs_buf_log_format *blf, enum xfs_blft type)
     576             : {
     577 10299530439 :         ASSERT(type > XFS_BLFT_UNKNOWN_BUF && type < XFS_BLFT_MAX_BUF);
     578 10299530439 :         blf->blf_flags &= ~XFS_BLFT_MASK;
     579 10299530439 :         blf->blf_flags |= ((type << XFS_BLFT_SHIFT) & XFS_BLFT_MASK);
     580 10299530439 : }
     581             : 
     582             : static inline uint16_t
     583             : xfs_blft_from_flags(struct xfs_buf_log_format *blf)
     584             : {
     585  2731164204 :         return (blf->blf_flags & XFS_BLFT_MASK) >> XFS_BLFT_SHIFT;
     586             : }
     587             : 
     588             : /*
     589             :  * EFI/EFD log format definitions
     590             :  */
     591             : typedef struct xfs_extent {
     592             :         xfs_fsblock_t   ext_start;
     593             :         xfs_extlen_t    ext_len;
     594             : } xfs_extent_t;
     595             : 
     596             : /*
     597             :  * Since an xfs_extent_t has types (start:64, len: 32)
     598             :  * there are different alignments on 32 bit and 64 bit kernels.
     599             :  * So we provide the different variants for use by a
     600             :  * conversion routine.
     601             :  */
     602             : typedef struct xfs_extent_32 {
     603             :         uint64_t        ext_start;
     604             :         uint32_t        ext_len;
     605             : } __attribute__((packed)) xfs_extent_32_t;
     606             : 
     607             : typedef struct xfs_extent_64 {
     608             :         uint64_t        ext_start;
     609             :         uint32_t        ext_len;
     610             :         uint32_t        ext_pad;
     611             : } xfs_extent_64_t;
     612             : 
     613             : /*
     614             :  * This is the structure used to lay out an efi log item in the
     615             :  * log.  The efi_extents field is a variable size array whose
     616             :  * size is given by efi_nextents.
     617             :  */
     618             : typedef struct xfs_efi_log_format {
     619             :         uint16_t                efi_type;       /* efi log item type */
     620             :         uint16_t                efi_size;       /* size of this item */
     621             :         uint32_t                efi_nextents;   /* # extents to free */
     622             :         uint64_t                efi_id;         /* efi identifier */
     623             :         xfs_extent_t            efi_extents[];  /* array of extents to free */
     624             : } xfs_efi_log_format_t;
     625             : 
     626             : static inline size_t
     627             : xfs_efi_log_format_sizeof(
     628             :         unsigned int            nr)
     629             : {
     630    72856846 :         return sizeof(struct xfs_efi_log_format) +
     631             :                         nr * sizeof(struct xfs_extent);
     632             : }
     633             : 
     634             : typedef struct xfs_efi_log_format_32 {
     635             :         uint16_t                efi_type;       /* efi log item type */
     636             :         uint16_t                efi_size;       /* size of this item */
     637             :         uint32_t                efi_nextents;   /* # extents to free */
     638             :         uint64_t                efi_id;         /* efi identifier */
     639             :         xfs_extent_32_t         efi_extents[];  /* array of extents to free */
     640             : } __attribute__((packed)) xfs_efi_log_format_32_t;
     641             : 
     642             : static inline size_t
     643             : xfs_efi_log_format32_sizeof(
     644             :         unsigned int            nr)
     645             : {
     646       57436 :         return sizeof(struct xfs_efi_log_format_32) +
     647       57436 :                         nr * sizeof(struct xfs_extent_32);
     648             : }
     649             : 
     650             : typedef struct xfs_efi_log_format_64 {
     651             :         uint16_t                efi_type;       /* efi log item type */
     652             :         uint16_t                efi_size;       /* size of this item */
     653             :         uint32_t                efi_nextents;   /* # extents to free */
     654             :         uint64_t                efi_id;         /* efi identifier */
     655             :         xfs_extent_64_t         efi_extents[];  /* array of extents to free */
     656             : } xfs_efi_log_format_64_t;
     657             : 
     658             : static inline size_t
     659             : xfs_efi_log_format64_sizeof(
     660             :         unsigned int            nr)
     661             : {
     662             :         return sizeof(struct xfs_efi_log_format_64) +
     663             :                         nr * sizeof(struct xfs_extent_64);
     664             : }
     665             : 
     666             : /*
     667             :  * This is the structure used to lay out an efd log item in the
     668             :  * log.  The efd_extents array is a variable size array whose
     669             :  * size is given by efd_nextents;
     670             :  */
     671             : typedef struct xfs_efd_log_format {
     672             :         uint16_t                efd_type;       /* efd log item type */
     673             :         uint16_t                efd_size;       /* size of this item */
     674             :         uint32_t                efd_nextents;   /* # of extents freed */
     675             :         uint64_t                efd_efi_id;     /* id of corresponding efi */
     676             :         xfs_extent_t            efd_extents[];  /* array of extents freed */
     677             : } xfs_efd_log_format_t;
     678             : 
     679             : static inline size_t
     680             : xfs_efd_log_format_sizeof(
     681             :         unsigned int            nr)
     682             : {
     683      272156 :         return sizeof(struct xfs_efd_log_format) +
     684             :                         nr * sizeof(struct xfs_extent);
     685             : }
     686             : 
     687             : typedef struct xfs_efd_log_format_32 {
     688             :         uint16_t                efd_type;       /* efd log item type */
     689             :         uint16_t                efd_size;       /* size of this item */
     690             :         uint32_t                efd_nextents;   /* # of extents freed */
     691             :         uint64_t                efd_efi_id;     /* id of corresponding efi */
     692             :         xfs_extent_32_t         efd_extents[];  /* array of extents freed */
     693             : } __attribute__((packed)) xfs_efd_log_format_32_t;
     694             : 
     695             : static inline size_t
     696             : xfs_efd_log_format32_sizeof(
     697             :         unsigned int            nr)
     698             : {
     699       56875 :         return sizeof(struct xfs_efd_log_format_32) +
     700       56875 :                         nr * sizeof(struct xfs_extent_32);
     701             : }
     702             : 
     703             : typedef struct xfs_efd_log_format_64 {
     704             :         uint16_t                efd_type;       /* efd log item type */
     705             :         uint16_t                efd_size;       /* size of this item */
     706             :         uint32_t                efd_nextents;   /* # of extents freed */
     707             :         uint64_t                efd_efi_id;     /* id of corresponding efi */
     708             :         xfs_extent_64_t         efd_extents[];  /* array of extents freed */
     709             : } xfs_efd_log_format_64_t;
     710             : 
     711             : static inline size_t
     712             : xfs_efd_log_format64_sizeof(
     713             :         unsigned int            nr)
     714             : {
     715       56875 :         return sizeof(struct xfs_efd_log_format_64) +
     716             :                         nr * sizeof(struct xfs_extent_64);
     717             : }
     718             : 
     719             : /*
     720             :  * RUI/RUD (reverse mapping) log format definitions
     721             :  */
     722             : struct xfs_map_extent {
     723             :         uint64_t                me_owner;
     724             :         uint64_t                me_startblock;
     725             :         uint64_t                me_startoff;
     726             :         uint32_t                me_len;
     727             :         uint32_t                me_flags;
     728             : };
     729             : 
     730             : /* rmap me_flags: upper bits are flags, lower byte is type code */
     731             : #define XFS_RMAP_EXTENT_MAP             1
     732             : #define XFS_RMAP_EXTENT_MAP_SHARED      2
     733             : #define XFS_RMAP_EXTENT_UNMAP           3
     734             : #define XFS_RMAP_EXTENT_UNMAP_SHARED    4
     735             : #define XFS_RMAP_EXTENT_CONVERT         5
     736             : #define XFS_RMAP_EXTENT_CONVERT_SHARED  6
     737             : #define XFS_RMAP_EXTENT_ALLOC           7
     738             : #define XFS_RMAP_EXTENT_FREE            8
     739             : #define XFS_RMAP_EXTENT_TYPE_MASK       0xFF
     740             : 
     741             : #define XFS_RMAP_EXTENT_ATTR_FORK       (1U << 31)
     742             : #define XFS_RMAP_EXTENT_BMBT_BLOCK      (1U << 30)
     743             : #define XFS_RMAP_EXTENT_UNWRITTEN       (1U << 29)
     744             : 
     745             : #define XFS_RMAP_EXTENT_FLAGS           (XFS_RMAP_EXTENT_TYPE_MASK | \
     746             :                                          XFS_RMAP_EXTENT_ATTR_FORK | \
     747             :                                          XFS_RMAP_EXTENT_BMBT_BLOCK | \
     748             :                                          XFS_RMAP_EXTENT_UNWRITTEN)
     749             : 
     750             : /*
     751             :  * This is the structure used to lay out an rui log item in the
     752             :  * log.  The rui_extents field is a variable size array whose
     753             :  * size is given by rui_nextents.
     754             :  */
     755             : struct xfs_rui_log_format {
     756             :         uint16_t                rui_type;       /* rui log item type */
     757             :         uint16_t                rui_size;       /* size of this item */
     758             :         uint32_t                rui_nextents;   /* # extents to free */
     759             :         uint64_t                rui_id;         /* rui identifier */
     760             :         struct xfs_map_extent   rui_extents[];  /* array of extents to rmap */
     761             : };
     762             : 
     763             : static inline size_t
     764             : xfs_rui_log_format_sizeof(
     765             :         unsigned int            nr)
     766             : {
     767   691779076 :         return sizeof(struct xfs_rui_log_format) +
     768   345918574 :                         nr * sizeof(struct xfs_map_extent);
     769             : }
     770             : 
     771             : /*
     772             :  * This is the structure used to lay out an rud log item in the
     773             :  * log.  The rud_extents array is a variable size array whose
     774             :  * size is given by rud_nextents;
     775             :  */
     776             : struct xfs_rud_log_format {
     777             :         uint16_t                rud_type;       /* rud log item type */
     778             :         uint16_t                rud_size;       /* size of this item */
     779             :         uint32_t                __pad;
     780             :         uint64_t                rud_rui_id;     /* id of corresponding rui */
     781             : };
     782             : 
     783             : /*
     784             :  * CUI/CUD (refcount update) log format definitions
     785             :  */
     786             : struct xfs_phys_extent {
     787             :         uint64_t                pe_startblock;
     788             :         uint32_t                pe_len;
     789             :         uint32_t                pe_flags;
     790             : };
     791             : 
     792             : /* refcount pe_flags: upper bits are flags, lower byte is type code */
     793             : /* Type codes are taken directly from enum xfs_refcount_intent_type. */
     794             : #define XFS_REFCOUNT_EXTENT_TYPE_MASK   0xFF
     795             : 
     796             : #define XFS_REFCOUNT_EXTENT_FLAGS       (XFS_REFCOUNT_EXTENT_TYPE_MASK)
     797             : 
     798             : /*
     799             :  * This is the structure used to lay out a cui log item in the
     800             :  * log.  The cui_extents field is a variable size array whose
     801             :  * size is given by cui_nextents.
     802             :  */
     803             : struct xfs_cui_log_format {
     804             :         uint16_t                cui_type;       /* cui log item type */
     805             :         uint16_t                cui_size;       /* size of this item */
     806             :         uint32_t                cui_nextents;   /* # extents to free */
     807             :         uint64_t                cui_id;         /* cui identifier */
     808             :         struct xfs_phys_extent  cui_extents[];  /* array of extents */
     809             : };
     810             : 
     811             : static inline size_t
     812             : xfs_cui_log_format_sizeof(
     813             :         unsigned int            nr)
     814             : {
     815   174078444 :         return sizeof(struct xfs_cui_log_format) +
     816             :                         nr * sizeof(struct xfs_phys_extent);
     817             : }
     818             : 
     819             : /*
     820             :  * This is the structure used to lay out a cud log item in the
     821             :  * log.  The cud_extents array is a variable size array whose
     822             :  * size is given by cud_nextents;
     823             :  */
     824             : struct xfs_cud_log_format {
     825             :         uint16_t                cud_type;       /* cud log item type */
     826             :         uint16_t                cud_size;       /* size of this item */
     827             :         uint32_t                __pad;
     828             :         uint64_t                cud_cui_id;     /* id of corresponding cui */
     829             : };
     830             : 
     831             : /*
     832             :  * BUI/BUD (inode block mapping) log format definitions
     833             :  */
     834             : 
     835             : /* bmbt me_flags: upper bits are flags, lower byte is type code */
     836             : /* Type codes are taken directly from enum xfs_bmap_intent_type. */
     837             : #define XFS_BMAP_EXTENT_TYPE_MASK       0xFF
     838             : 
     839             : #define XFS_BMAP_EXTENT_ATTR_FORK       (1U << 31)
     840             : #define XFS_BMAP_EXTENT_UNWRITTEN       (1U << 30)
     841             : 
     842             : #define XFS_BMAP_EXTENT_FLAGS           (XFS_BMAP_EXTENT_TYPE_MASK | \
     843             :                                          XFS_BMAP_EXTENT_ATTR_FORK | \
     844             :                                          XFS_BMAP_EXTENT_UNWRITTEN)
     845             : 
     846             : /*
     847             :  * This is the structure used to lay out an bui log item in the
     848             :  * log.  The bui_extents field is a variable size array whose
     849             :  * size is given by bui_nextents.
     850             :  */
     851             : struct xfs_bui_log_format {
     852             :         uint16_t                bui_type;       /* bui log item type */
     853             :         uint16_t                bui_size;       /* size of this item */
     854             :         uint32_t                bui_nextents;   /* # extents to free */
     855             :         uint64_t                bui_id;         /* bui identifier */
     856             :         struct xfs_map_extent   bui_extents[];  /* array of extents to bmap */
     857             : };
     858             : 
     859             : static inline size_t
     860             : xfs_bui_log_format_sizeof(
     861             :         unsigned int            nr)
     862             : {
     863   211856440 :         return sizeof(struct xfs_bui_log_format) +
     864   105928187 :                         nr * sizeof(struct xfs_map_extent);
     865             : }
     866             : 
     867             : /*
     868             :  * This is the structure used to lay out an bud log item in the
     869             :  * log.  The bud_extents array is a variable size array whose
     870             :  * size is given by bud_nextents;
     871             :  */
     872             : struct xfs_bud_log_format {
     873             :         uint16_t                bud_type;       /* bud log item type */
     874             :         uint16_t                bud_size;       /* size of this item */
     875             :         uint32_t                __pad;
     876             :         uint64_t                bud_bui_id;     /* id of corresponding bui */
     877             : };
     878             : 
     879             : /*
     880             :  * Dquot Log format definitions.
     881             :  *
     882             :  * The first two fields must be the type and size fitting into
     883             :  * 32 bits : log_recovery code assumes that.
     884             :  */
     885             : typedef struct xfs_dq_logformat {
     886             :         uint16_t                qlf_type;      /* dquot log item type */
     887             :         uint16_t                qlf_size;      /* size of this item */
     888             :         xfs_dqid_t              qlf_id;        /* usr/grp/proj id : 32 bits */
     889             :         int64_t                 qlf_blkno;     /* blkno of dquot buffer */
     890             :         int32_t                 qlf_len;       /* len of dquot buffer */
     891             :         uint32_t                qlf_boffset;   /* off of dquot in buffer */
     892             : } xfs_dq_logformat_t;
     893             : 
     894             : /*
     895             :  * log format struct for QUOTAOFF records.
     896             :  * The first two fields must be the type and size fitting into
     897             :  * 32 bits : log_recovery code assumes that.
     898             :  * We write two LI_QUOTAOFF logitems per quotaoff, the last one keeps a pointer
     899             :  * to the first and ensures that the first logitem is taken out of the AIL
     900             :  * only when the last one is securely committed.
     901             :  */
     902             : typedef struct xfs_qoff_logformat {
     903             :         unsigned short          qf_type;        /* quotaoff log item type */
     904             :         unsigned short          qf_size;        /* size of this item */
     905             :         unsigned int            qf_flags;       /* USR and/or GRP */
     906             :         char                    qf_pad[12];     /* padding for future */
     907             : } xfs_qoff_logformat_t;
     908             : 
     909             : /*
     910             :  * Disk quotas status in m_qflags, and also sb_qflags. 16 bits.
     911             :  */
     912             : #define XFS_UQUOTA_ACCT 0x0001  /* user quota accounting ON */
     913             : #define XFS_UQUOTA_ENFD 0x0002  /* user quota limits enforced */
     914             : #define XFS_UQUOTA_CHKD 0x0004  /* quotacheck run on usr quotas */
     915             : #define XFS_PQUOTA_ACCT 0x0008  /* project quota accounting ON */
     916             : #define XFS_OQUOTA_ENFD 0x0010  /* other (grp/prj) quota limits enforced */
     917             : #define XFS_OQUOTA_CHKD 0x0020  /* quotacheck run on other (grp/prj) quotas */
     918             : #define XFS_GQUOTA_ACCT 0x0040  /* group quota accounting ON */
     919             : 
     920             : /*
     921             :  * Conversion to and from the combined OQUOTA flag (if necessary)
     922             :  * is done only in xfs_sb_qflags_to_disk() and xfs_sb_qflags_from_disk()
     923             :  */
     924             : #define XFS_GQUOTA_ENFD 0x0080  /* group quota limits enforced */
     925             : #define XFS_GQUOTA_CHKD 0x0100  /* quotacheck run on group quotas */
     926             : #define XFS_PQUOTA_ENFD 0x0200  /* project quota limits enforced */
     927             : #define XFS_PQUOTA_CHKD 0x0400  /* quotacheck run on project quotas */
     928             : 
     929             : #define XFS_ALL_QUOTA_ACCT      \
     930             :                 (XFS_UQUOTA_ACCT | XFS_GQUOTA_ACCT | XFS_PQUOTA_ACCT)
     931             : #define XFS_ALL_QUOTA_ENFD      \
     932             :                 (XFS_UQUOTA_ENFD | XFS_GQUOTA_ENFD | XFS_PQUOTA_ENFD)
     933             : #define XFS_ALL_QUOTA_CHKD      \
     934             :                 (XFS_UQUOTA_CHKD | XFS_GQUOTA_CHKD | XFS_PQUOTA_CHKD)
     935             : 
     936             : #define XFS_MOUNT_QUOTA_ALL     (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\
     937             :                                  XFS_UQUOTA_CHKD|XFS_GQUOTA_ACCT|\
     938             :                                  XFS_GQUOTA_ENFD|XFS_GQUOTA_CHKD|\
     939             :                                  XFS_PQUOTA_ACCT|XFS_PQUOTA_ENFD|\
     940             :                                  XFS_PQUOTA_CHKD)
     941             : 
     942             : /*
     943             :  * Inode create log item structure
     944             :  *
     945             :  * Log recovery assumes the first two entries are the type and size and they fit
     946             :  * in 32 bits. Also in host order (ugh) so they have to be 32 bit aligned so
     947             :  * decoding can be done correctly.
     948             :  */
     949             : struct xfs_icreate_log {
     950             :         uint16_t        icl_type;       /* type of log format structure */
     951             :         uint16_t        icl_size;       /* size of log format structure */
     952             :         __be32          icl_ag;         /* ag being allocated in */
     953             :         __be32          icl_agbno;      /* start block of inode range */
     954             :         __be32          icl_count;      /* number of inodes to initialise */
     955             :         __be32          icl_isize;      /* size of inodes */
     956             :         __be32          icl_length;     /* length of extent to initialise */
     957             :         __be32          icl_gen;        /* inode generation number to use */
     958             : };
     959             : 
     960             : /*
     961             :  * Flags for deferred attribute operations.
     962             :  * Upper bits are flags, lower byte is type code
     963             :  */
     964             : #define XFS_ATTRI_OP_FLAGS_SET          1       /* Set the attribute */
     965             : #define XFS_ATTRI_OP_FLAGS_REMOVE       2       /* Remove the attribute */
     966             : #define XFS_ATTRI_OP_FLAGS_REPLACE      3       /* Replace the attribute */
     967             : #define XFS_ATTRI_OP_FLAGS_TYPE_MASK    0xFF    /* Flags type mask */
     968             : 
     969             : /*
     970             :  * alfi_attr_filter captures the state of xfs_da_args.attr_filter, so it should
     971             :  * never have any other bits set.
     972             :  */
     973             : #define XFS_ATTRI_FILTER_MASK           (XFS_ATTR_ROOT | \
     974             :                                          XFS_ATTR_SECURE | \
     975             :                                          XFS_ATTR_INCOMPLETE)
     976             : 
     977             : /*
     978             :  * This is the structure used to lay out an attr log item in the
     979             :  * log.
     980             :  */
     981             : struct xfs_attri_log_format {
     982             :         uint16_t        alfi_type;      /* attri log item type */
     983             :         uint16_t        alfi_size;      /* size of this item */
     984             :         uint32_t        __pad;          /* pad to 64 bit aligned */
     985             :         uint64_t        alfi_id;        /* attri identifier */
     986             :         uint64_t        alfi_ino;       /* the inode for this attr operation */
     987             :         uint32_t        alfi_op_flags;  /* marks the op as a set or remove */
     988             :         uint32_t        alfi_name_len;  /* attr name length */
     989             :         uint32_t        alfi_value_len; /* attr value length */
     990             :         uint32_t        alfi_attr_filter;/* attr filter flags */
     991             : };
     992             : 
     993             : struct xfs_attrd_log_format {
     994             :         uint16_t        alfd_type;      /* attrd log item type */
     995             :         uint16_t        alfd_size;      /* size of this item */
     996             :         uint32_t        __pad;          /* pad to 64 bit aligned */
     997             :         uint64_t        alfd_alf_id;    /* id of corresponding attri */
     998             : };
     999             : 
    1000             : #endif /* __XFS_LOG_FORMAT_H__ */

Generated by: LCOV version 1.14