LCOV - code coverage report
Current view: top level - fs/xfs/libxfs - xfs_da_format.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc3-djwa @ Mon Jul 31 20:08:17 PDT 2023 Lines: 28 29 96.6 %
Date: 2023-07-31 20:08:17 Functions: 5 5 100.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : /*
       3             :  * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
       4             :  * Copyright (c) 2013 Red Hat, Inc.
       5             :  * All Rights Reserved.
       6             :  */
       7             : #ifndef __XFS_DA_FORMAT_H__
       8             : #define __XFS_DA_FORMAT_H__
       9             : 
      10             : /*
      11             :  * This structure is common to both leaf nodes and non-leaf nodes in the Btree.
      12             :  *
      13             :  * It is used to manage a doubly linked list of all blocks at the same
      14             :  * level in the Btree, and to identify which type of block this is.
      15             :  */
      16             : #define XFS_DA_NODE_MAGIC       0xfebe  /* magic number: non-leaf blocks */
      17             : #define XFS_ATTR_LEAF_MAGIC     0xfbee  /* magic number: attribute leaf blks */
      18             : #define XFS_DIR2_LEAF1_MAGIC    0xd2f1  /* magic number: v2 dirlf single blks */
      19             : #define XFS_DIR2_LEAFN_MAGIC    0xd2ff  /* magic number: v2 dirlf multi blks */
      20             : 
      21             : typedef struct xfs_da_blkinfo {
      22             :         __be32          forw;                   /* previous block in list */
      23             :         __be32          back;                   /* following block in list */
      24             :         __be16          magic;                  /* validity check on block */
      25             :         __be16          pad;                    /* unused */
      26             : } xfs_da_blkinfo_t;
      27             : 
      28             : /*
      29             :  * CRC enabled directory structure types
      30             :  *
      31             :  * The headers change size for the additional verification information, but
      32             :  * otherwise the tree layouts and contents are unchanged. Hence the da btree
      33             :  * code can use the struct xfs_da_blkinfo for manipulating the tree links and
      34             :  * magic numbers without modification for both v2 and v3 nodes.
      35             :  */
      36             : #define XFS_DA3_NODE_MAGIC      0x3ebe  /* magic number: non-leaf blocks */
      37             : #define XFS_ATTR3_LEAF_MAGIC    0x3bee  /* magic number: attribute leaf blks */
      38             : #define XFS_DIR3_LEAF1_MAGIC    0x3df1  /* magic number: v3 dirlf single blks */
      39             : #define XFS_DIR3_LEAFN_MAGIC    0x3dff  /* magic number: v3 dirlf multi blks */
      40             : 
      41             : struct xfs_da3_blkinfo {
      42             :         /*
      43             :          * the node link manipulation code relies on the fact that the first
      44             :          * element of this structure is the struct xfs_da_blkinfo so it can
      45             :          * ignore the differences in the rest of the structures.
      46             :          */
      47             :         struct xfs_da_blkinfo   hdr;
      48             :         __be32                  crc;    /* CRC of block */
      49             :         __be64                  blkno;  /* first block of the buffer */
      50             :         __be64                  lsn;    /* sequence number of last write */
      51             :         uuid_t                  uuid;   /* filesystem we belong to */
      52             :         __be64                  owner;  /* inode that owns the block */
      53             : };
      54             : 
      55             : /*
      56             :  * This is the structure of the root and intermediate nodes in the Btree.
      57             :  * The leaf nodes are defined above.
      58             :  *
      59             :  * Entries are not packed.
      60             :  *
      61             :  * Since we have duplicate keys, use a binary search but always follow
      62             :  * all match in the block, not just the first match found.
      63             :  */
      64             : #define XFS_DA_NODE_MAXDEPTH    5       /* max depth of Btree */
      65             : 
      66             : typedef struct xfs_da_node_hdr {
      67             :         struct xfs_da_blkinfo   info;   /* block type, links, etc. */
      68             :         __be16                  __count; /* count of active entries */
      69             :         __be16                  __level; /* level above leaves (leaf == 0) */
      70             : } xfs_da_node_hdr_t;
      71             : 
      72             : struct xfs_da3_node_hdr {
      73             :         struct xfs_da3_blkinfo  info;   /* block type, links, etc. */
      74             :         __be16                  __count; /* count of active entries */
      75             :         __be16                  __level; /* level above leaves (leaf == 0) */
      76             :         __be32                  __pad32;
      77             : };
      78             : 
      79             : #define XFS_DA3_NODE_CRC_OFF    (offsetof(struct xfs_da3_node_hdr, info.crc))
      80             : 
      81             : typedef struct xfs_da_node_entry {
      82             :         __be32  hashval;        /* hash value for this descendant */
      83             :         __be32  before;         /* Btree block before this key */
      84             : } xfs_da_node_entry_t;
      85             : 
      86             : typedef struct xfs_da_intnode {
      87             :         struct xfs_da_node_hdr  hdr;
      88             :         struct xfs_da_node_entry __btree[];
      89             : } xfs_da_intnode_t;
      90             : 
      91             : struct xfs_da3_intnode {
      92             :         struct xfs_da3_node_hdr hdr;
      93             :         struct xfs_da_node_entry __btree[];
      94             : };
      95             : 
      96             : /*
      97             :  * Directory version 2.
      98             :  *
      99             :  * There are 4 possible formats:
     100             :  *  - shortform - embedded into the inode
     101             :  *  - single block - data with embedded leaf at the end
     102             :  *  - multiple data blocks, single leaf+freeindex block
     103             :  *  - data blocks, node and leaf blocks (btree), freeindex blocks
     104             :  *
     105             :  * Note: many node blocks structures and constants are shared with the attr
     106             :  * code and defined in xfs_da_btree.h.
     107             :  */
     108             : 
     109             : #define XFS_DIR2_BLOCK_MAGIC    0x58443242      /* XD2B: single block dirs */
     110             : #define XFS_DIR2_DATA_MAGIC     0x58443244      /* XD2D: multiblock dirs */
     111             : #define XFS_DIR2_FREE_MAGIC     0x58443246      /* XD2F: free index blocks */
     112             : 
     113             : /*
     114             :  * Directory Version 3 With CRCs.
     115             :  *
     116             :  * The tree formats are the same as for version 2 directories.  The difference
     117             :  * is in the block header and dirent formats. In many cases the v3 structures
     118             :  * use v2 definitions as they are no different and this makes code sharing much
     119             :  * easier.
     120             :  *
     121             :  * Also, the xfs_dir3_*() functions handle both v2 and v3 formats - if the
     122             :  * format is v2 then they switch to the existing v2 code, or the format is v3
     123             :  * they implement the v3 functionality. This means the existing dir2 is a mix of
     124             :  * xfs_dir2/xfs_dir3 calls and functions. The xfs_dir3 functions are called
     125             :  * where there is a difference in the formats, otherwise the code is unchanged.
     126             :  *
     127             :  * Where it is possible, the code decides what to do based on the magic numbers
     128             :  * in the blocks rather than feature bits in the superblock. This means the code
     129             :  * is as independent of the external XFS code as possible as doesn't require
     130             :  * passing struct xfs_mount pointers into places where it isn't really
     131             :  * necessary.
     132             :  *
     133             :  * Version 3 includes:
     134             :  *
     135             :  *      - a larger block header for CRC and identification purposes and so the
     136             :  *      offsets of all the structures inside the blocks are different.
     137             :  *
     138             :  *      - new magic numbers to be able to detect the v2/v3 types on the fly.
     139             :  */
     140             : 
     141             : #define XFS_DIR3_BLOCK_MAGIC    0x58444233      /* XDB3: single block dirs */
     142             : #define XFS_DIR3_DATA_MAGIC     0x58444433      /* XDD3: multiblock dirs */
     143             : #define XFS_DIR3_FREE_MAGIC     0x58444633      /* XDF3: free index blocks */
     144             : 
     145             : /*
     146             :  * Dirents in version 3 directories have a file type field. Additions to this
     147             :  * list are an on-disk format change, requiring feature bits. Valid values
     148             :  * are as follows:
     149             :  */
     150             : #define XFS_DIR3_FT_UNKNOWN             0
     151             : #define XFS_DIR3_FT_REG_FILE            1
     152             : #define XFS_DIR3_FT_DIR                 2
     153             : #define XFS_DIR3_FT_CHRDEV              3
     154             : #define XFS_DIR3_FT_BLKDEV              4
     155             : #define XFS_DIR3_FT_FIFO                5
     156             : #define XFS_DIR3_FT_SOCK                6
     157             : #define XFS_DIR3_FT_SYMLINK             7
     158             : #define XFS_DIR3_FT_WHT                 8
     159             : 
     160             : #define XFS_DIR3_FT_MAX                 9
     161             : 
     162             : /*
     163             :  * Byte offset in data block and shortform entry.
     164             :  */
     165             : typedef uint16_t        xfs_dir2_data_off_t;
     166             : #define NULLDATAOFF     0xffffU
     167             : typedef uint            xfs_dir2_data_aoff_t;   /* argument form */
     168             : 
     169             : /*
     170             :  * Offset in data space of a data entry.
     171             :  */
     172             : typedef uint32_t        xfs_dir2_dataptr_t;
     173             : #define XFS_DIR2_MAX_DATAPTR    ((xfs_dir2_dataptr_t)0xffffffff)
     174             : #define XFS_DIR2_NULL_DATAPTR   ((xfs_dir2_dataptr_t)0)
     175             : 
     176             : /*
     177             :  * Byte offset in a directory.
     178             :  */
     179             : typedef xfs_off_t       xfs_dir2_off_t;
     180             : 
     181             : /*
     182             :  * Directory block number (logical dirblk in file)
     183             :  */
     184             : typedef uint32_t        xfs_dir2_db_t;
     185             : 
     186             : #define XFS_INO32_SIZE  4
     187             : #define XFS_INO64_SIZE  8
     188             : #define XFS_INO64_DIFF  (XFS_INO64_SIZE - XFS_INO32_SIZE)
     189             : 
     190             : #define XFS_DIR2_MAX_SHORT_INUM ((xfs_ino_t)0xffffffffULL)
     191             : 
     192             : /*
     193             :  * Directory layout when stored internal to an inode.
     194             :  *
     195             :  * Small directories are packed as tightly as possible so as to fit into the
     196             :  * literal area of the inode.  These "shortform" directories consist of a
     197             :  * single xfs_dir2_sf_hdr header followed by zero or more xfs_dir2_sf_entry
     198             :  * structures.  Due the different inode number storage size and the variable
     199             :  * length name field in the xfs_dir2_sf_entry all these structure are
     200             :  * variable length, and the accessors in this file should be used to iterate
     201             :  * over them.
     202             :  */
     203             : typedef struct xfs_dir2_sf_hdr {
     204             :         uint8_t                 count;          /* count of entries */
     205             :         uint8_t                 i8count;        /* count of 8-byte inode #s */
     206             :         uint8_t                 parent[8];      /* parent dir inode number */
     207             : } __packed xfs_dir2_sf_hdr_t;
     208             : 
     209             : typedef struct xfs_dir2_sf_entry {
     210             :         __u8                    namelen;        /* actual name length */
     211             :         __u8                    offset[2];      /* saved offset */
     212             :         __u8                    name[];         /* name, variable size */
     213             :         /*
     214             :          * A single byte containing the file type field follows the inode
     215             :          * number for version 3 directory entries.
     216             :          *
     217             :          * A 64-bit or 32-bit inode number follows here, at a variable offset
     218             :          * after the name.
     219             :          */
     220             : } __packed xfs_dir2_sf_entry_t;
     221             : 
     222             : static inline int xfs_dir2_sf_hdr_size(int i8count)
     223             : {
     224  1061046133 :         return sizeof(struct xfs_dir2_sf_hdr) -
     225             :                 (i8count == 0) * XFS_INO64_DIFF;
     226             : }
     227             : 
     228             : static inline xfs_dir2_data_aoff_t
     229             : xfs_dir2_sf_get_offset(xfs_dir2_sf_entry_t *sfep)
     230             : {
     231  5502126779 :         return get_unaligned_be16(sfep->offset);
     232             : }
     233             : 
     234             : static inline void
     235             : xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t *sfep, xfs_dir2_data_aoff_t off)
     236             : {
     237    29824046 :         put_unaligned_be16(off, sfep->offset);
     238             : }
     239             : 
     240             : static inline struct xfs_dir2_sf_entry *
     241             : xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr)
     242             : {
     243  3004182522 :         return (struct xfs_dir2_sf_entry *)
     244  1502091261 :                 ((char *)hdr + xfs_dir2_sf_hdr_size(hdr->i8count));
     245             : }
     246             : 
     247             : /*
     248             :  * Data block structures.
     249             :  *
     250             :  * A pure data block looks like the following drawing on disk:
     251             :  *
     252             :  *    +-------------------------------------------------+
     253             :  *    | xfs_dir2_data_hdr_t                             |
     254             :  *    +-------------------------------------------------+
     255             :  *    | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t |
     256             :  *    | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t |
     257             :  *    | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t |
     258             :  *    | ...                                             |
     259             :  *    +-------------------------------------------------+
     260             :  *    | unused space                                    |
     261             :  *    +-------------------------------------------------+
     262             :  *
     263             :  * As all the entries are variable size structures the accessors below should
     264             :  * be used to iterate over them.
     265             :  *
     266             :  * In addition to the pure data blocks for the data and node formats,
     267             :  * most structures are also used for the combined data/freespace "block"
     268             :  * format below.
     269             :  */
     270             : 
     271             : #define XFS_DIR2_DATA_ALIGN_LOG 3               /* i.e., 8 bytes */
     272             : #define XFS_DIR2_DATA_ALIGN     (1 << XFS_DIR2_DATA_ALIGN_LOG)
     273             : #define XFS_DIR2_DATA_FREE_TAG  0xffff
     274             : #define XFS_DIR2_DATA_FD_COUNT  3
     275             : 
     276             : /*
     277             :  * Directory address space divided into sections,
     278             :  * spaces separated by 32GB.
     279             :  */
     280             : #define XFS_DIR2_MAX_SPACES     3
     281             : #define XFS_DIR2_SPACE_SIZE     (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG))
     282             : #define XFS_DIR2_DATA_SPACE     0
     283             : #define XFS_DIR2_DATA_OFFSET    (XFS_DIR2_DATA_SPACE * XFS_DIR2_SPACE_SIZE)
     284             : 
     285             : /*
     286             :  * Describe a free area in the data block.
     287             :  *
     288             :  * The freespace will be formatted as a xfs_dir2_data_unused_t.
     289             :  */
     290             : typedef struct xfs_dir2_data_free {
     291             :         __be16                  offset;         /* start of freespace */
     292             :         __be16                  length;         /* length of freespace */
     293             : } xfs_dir2_data_free_t;
     294             : 
     295             : /*
     296             :  * Header for the data blocks.
     297             :  *
     298             :  * The code knows that XFS_DIR2_DATA_FD_COUNT is 3.
     299             :  */
     300             : typedef struct xfs_dir2_data_hdr {
     301             :         __be32                  magic;          /* XFS_DIR2_DATA_MAGIC or */
     302             :                                                 /* XFS_DIR2_BLOCK_MAGIC */
     303             :         xfs_dir2_data_free_t    bestfree[XFS_DIR2_DATA_FD_COUNT];
     304             : } xfs_dir2_data_hdr_t;
     305             : 
     306             : /*
     307             :  * define a structure for all the verification fields we are adding to the
     308             :  * directory block structures. This will be used in several structures.
     309             :  * The magic number must be the first entry to align with all the dir2
     310             :  * structures so we determine how to decode them just by the magic number.
     311             :  */
     312             : struct xfs_dir3_blk_hdr {
     313             :         __be32                  magic;  /* magic number */
     314             :         __be32                  crc;    /* CRC of block */
     315             :         __be64                  blkno;  /* first block of the buffer */
     316             :         __be64                  lsn;    /* sequence number of last write */
     317             :         uuid_t                  uuid;   /* filesystem we belong to */
     318             :         __be64                  owner;  /* inode that owns the block */
     319             : };
     320             : 
     321             : struct xfs_dir3_data_hdr {
     322             :         struct xfs_dir3_blk_hdr hdr;
     323             :         xfs_dir2_data_free_t    best_free[XFS_DIR2_DATA_FD_COUNT];
     324             :         __be32                  pad;    /* 64 bit alignment */
     325             : };
     326             : 
     327             : #define XFS_DIR3_DATA_CRC_OFF  offsetof(struct xfs_dir3_data_hdr, hdr.crc)
     328             : 
     329             : /*
     330             :  * Active entry in a data block.
     331             :  *
     332             :  * Aligned to 8 bytes.  After the variable length name field there is a
     333             :  * 2 byte tag field, which can be accessed using xfs_dir3_data_entry_tag_p.
     334             :  *
     335             :  * For dir3 structures, there is file type field between the name and the tag.
     336             :  * This can only be manipulated by helper functions. It is packed hard against
     337             :  * the end of the name so any padding for rounding is between the file type and
     338             :  * the tag.
     339             :  */
     340             : typedef struct xfs_dir2_data_entry {
     341             :         __be64                  inumber;        /* inode number */
     342             :         __u8                    namelen;        /* name length */
     343             :         __u8                    name[];         /* name bytes, no null */
     344             :      /* __u8                    filetype; */    /* type of inode we point to */
     345             :      /* __be16                  tag; */         /* starting offset of us */
     346             : } xfs_dir2_data_entry_t;
     347             : 
     348             : /*
     349             :  * Unused entry in a data block.
     350             :  *
     351             :  * Aligned to 8 bytes.  Tag appears as the last 2 bytes and must be accessed
     352             :  * using xfs_dir2_data_unused_tag_p.
     353             :  */
     354             : typedef struct xfs_dir2_data_unused {
     355             :         __be16                  freetag;        /* XFS_DIR2_DATA_FREE_TAG */
     356             :         __be16                  length;         /* total free length */
     357             :                                                 /* variable offset */
     358             :         __be16                  tag;            /* starting offset of us */
     359             : } xfs_dir2_data_unused_t;
     360             : 
     361             : /*
     362             :  * Pointer to a freespace's tag word.
     363             :  */
     364             : static inline __be16 *
     365  6120475842 : xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused *dup)
     366             : {
     367 12240951684 :         return (__be16 *)((char *)dup +
     368  6120475842 :                         be16_to_cpu(dup->length) - sizeof(__be16));
     369             : }
     370             : 
     371             : /*
     372             :  * Leaf block structures.
     373             :  *
     374             :  * A pure leaf block looks like the following drawing on disk:
     375             :  *
     376             :  *    +---------------------------+
     377             :  *    | xfs_dir2_leaf_hdr_t       |
     378             :  *    +---------------------------+
     379             :  *    | xfs_dir2_leaf_entry_t     |
     380             :  *    | xfs_dir2_leaf_entry_t     |
     381             :  *    | xfs_dir2_leaf_entry_t     |
     382             :  *    | xfs_dir2_leaf_entry_t     |
     383             :  *    | ...                       |
     384             :  *    +---------------------------+
     385             :  *    | xfs_dir2_data_off_t       |
     386             :  *    | xfs_dir2_data_off_t       |
     387             :  *    | xfs_dir2_data_off_t       |
     388             :  *    | ...                       |
     389             :  *    +---------------------------+
     390             :  *    | xfs_dir2_leaf_tail_t      |
     391             :  *    +---------------------------+
     392             :  *
     393             :  * The xfs_dir2_data_off_t members (bests) and tail are at the end of the block
     394             :  * for single-leaf (magic = XFS_DIR2_LEAF1_MAGIC) blocks only, but not present
     395             :  * for directories with separate leaf nodes and free space blocks
     396             :  * (magic = XFS_DIR2_LEAFN_MAGIC).
     397             :  *
     398             :  * As all the entries are variable size structures the accessors below should
     399             :  * be used to iterate over them.
     400             :  */
     401             : 
     402             : /*
     403             :  * Offset of the leaf/node space.  First block in this space
     404             :  * is the btree root.
     405             :  */
     406             : #define XFS_DIR2_LEAF_SPACE     1
     407             : #define XFS_DIR2_LEAF_OFFSET    (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE)
     408             : 
     409             : /*
     410             :  * Leaf block header.
     411             :  */
     412             : typedef struct xfs_dir2_leaf_hdr {
     413             :         xfs_da_blkinfo_t        info;           /* header for da routines */
     414             :         __be16                  count;          /* count of entries */
     415             :         __be16                  stale;          /* count of stale entries */
     416             : } xfs_dir2_leaf_hdr_t;
     417             : 
     418             : struct xfs_dir3_leaf_hdr {
     419             :         struct xfs_da3_blkinfo  info;           /* header for da routines */
     420             :         __be16                  count;          /* count of entries */
     421             :         __be16                  stale;          /* count of stale entries */
     422             :         __be32                  pad;            /* 64 bit alignment */
     423             : };
     424             : 
     425             : /*
     426             :  * Leaf block entry.
     427             :  */
     428             : typedef struct xfs_dir2_leaf_entry {
     429             :         __be32                  hashval;        /* hash value of name */
     430             :         __be32                  address;        /* address of data entry */
     431             : } xfs_dir2_leaf_entry_t;
     432             : 
     433             : /*
     434             :  * Leaf block tail.
     435             :  */
     436             : typedef struct xfs_dir2_leaf_tail {
     437             :         __be32                  bestcount;
     438             : } xfs_dir2_leaf_tail_t;
     439             : 
     440             : /*
     441             :  * Leaf block.
     442             :  */
     443             : typedef struct xfs_dir2_leaf {
     444             :         xfs_dir2_leaf_hdr_t     hdr;                    /* leaf header */
     445             :         xfs_dir2_leaf_entry_t   __ents[];               /* entries */
     446             : } xfs_dir2_leaf_t;
     447             : 
     448             : struct xfs_dir3_leaf {
     449             :         struct xfs_dir3_leaf_hdr        hdr;            /* leaf header */
     450             :         struct xfs_dir2_leaf_entry      __ents[];       /* entries */
     451             : };
     452             : 
     453             : #define XFS_DIR3_LEAF_CRC_OFF  offsetof(struct xfs_dir3_leaf_hdr, info.crc)
     454             : 
     455             : /*
     456             :  * Get address of the bests array in the single-leaf block.
     457             :  */
     458             : static inline __be16 *
     459    50857449 : xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp)
     460             : {
     461    50857449 :         return (__be16 *)ltp - be32_to_cpu(ltp->bestcount);
     462             : }
     463             : 
     464             : /*
     465             :  * Free space block definitions for the node format.
     466             :  */
     467             : 
     468             : /*
     469             :  * Offset of the freespace index.
     470             :  */
     471             : #define XFS_DIR2_FREE_SPACE     2
     472             : #define XFS_DIR2_FREE_OFFSET    (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE)
     473             : 
     474             : typedef struct xfs_dir2_free_hdr {
     475             :         __be32                  magic;          /* XFS_DIR2_FREE_MAGIC */
     476             :         __be32                  firstdb;        /* db of first entry */
     477             :         __be32                  nvalid;         /* count of valid entries */
     478             :         __be32                  nused;          /* count of used entries */
     479             : } xfs_dir2_free_hdr_t;
     480             : 
     481             : typedef struct xfs_dir2_free {
     482             :         xfs_dir2_free_hdr_t     hdr;            /* block header */
     483             :         __be16                  bests[];        /* best free counts */
     484             :                                                 /* unused entries are -1 */
     485             : } xfs_dir2_free_t;
     486             : 
     487             : struct xfs_dir3_free_hdr {
     488             :         struct xfs_dir3_blk_hdr hdr;
     489             :         __be32                  firstdb;        /* db of first entry */
     490             :         __be32                  nvalid;         /* count of valid entries */
     491             :         __be32                  nused;          /* count of used entries */
     492             :         __be32                  pad;            /* 64 bit alignment */
     493             : };
     494             : 
     495             : struct xfs_dir3_free {
     496             :         struct xfs_dir3_free_hdr hdr;
     497             :         __be16                  bests[];        /* best free counts */
     498             :                                                 /* unused entries are -1 */
     499             : };
     500             : 
     501             : #define XFS_DIR3_FREE_CRC_OFF  offsetof(struct xfs_dir3_free, hdr.hdr.crc)
     502             : 
     503             : /*
     504             :  * Single block format.
     505             :  *
     506             :  * The single block format looks like the following drawing on disk:
     507             :  *
     508             :  *    +-------------------------------------------------+
     509             :  *    | xfs_dir2_data_hdr_t                             |
     510             :  *    +-------------------------------------------------+
     511             :  *    | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t |
     512             :  *    | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t |
     513             :  *    | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t :
     514             :  *    | ...                                             |
     515             :  *    +-------------------------------------------------+
     516             :  *    | unused space                                    |
     517             :  *    +-------------------------------------------------+
     518             :  *    | ...                                             |
     519             :  *    | xfs_dir2_leaf_entry_t                           |
     520             :  *    | xfs_dir2_leaf_entry_t                           |
     521             :  *    +-------------------------------------------------+
     522             :  *    | xfs_dir2_block_tail_t                           |
     523             :  *    +-------------------------------------------------+
     524             :  *
     525             :  * As all the entries are variable size structures the accessors below should
     526             :  * be used to iterate over them.
     527             :  */
     528             : 
     529             : typedef struct xfs_dir2_block_tail {
     530             :         __be32          count;                  /* count of leaf entries */
     531             :         __be32          stale;                  /* count of stale lf entries */
     532             : } xfs_dir2_block_tail_t;
     533             : 
     534             : /*
     535             :  * Pointer to the leaf entries embedded in a data block (1-block format)
     536             :  */
     537             : static inline struct xfs_dir2_leaf_entry *
     538    54433356 : xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp)
     539             : {
     540    54433356 :         return ((struct xfs_dir2_leaf_entry *)btp) - be32_to_cpu(btp->count);
     541             : }
     542             : 
     543             : 
     544             : /*
     545             :  * Attribute storage layout
     546             :  *
     547             :  * Attribute lists are structured around Btrees where all the data
     548             :  * elements are in the leaf nodes.  Attribute names are hashed into an int,
     549             :  * then that int is used as the index into the Btree.  Since the hashval
     550             :  * of an attribute name may not be unique, we may have duplicate keys.  The
     551             :  * internal links in the Btree are logical block offsets into the file.
     552             :  *
     553             :  * Struct leaf_entry's are packed from the top.  Name/values grow from the
     554             :  * bottom but are not packed.  The freemap contains run-length-encoded entries
     555             :  * for the free bytes after the leaf_entry's, but only the N largest such,
     556             :  * smaller runs are dropped.  When the freemap doesn't show enough space
     557             :  * for an allocation, we compact the name/value area and try again.  If we
     558             :  * still don't have enough space, then we have to split the block.  The
     559             :  * name/value structs (both local and remote versions) must be 32bit aligned.
     560             :  *
     561             :  * Since we have duplicate hash keys, for each key that matches, compare
     562             :  * the actual name string.  The root and intermediate node search always
     563             :  * takes the first-in-the-block key match found, so we should only have
     564             :  * to work "forw"ard.  If none matches, continue with the "forw"ard leaf
     565             :  * nodes until the hash key changes or the attribute name is found.
     566             :  *
     567             :  * We store the fact that an attribute is a ROOT/USER/SECURE attribute in
     568             :  * the leaf_entry.  The namespaces are independent only because we also look
     569             :  * at the namespace bit when we are looking for a matching attribute name.
     570             :  *
     571             :  * We also store an "incomplete" bit in the leaf_entry.  It shows that an
     572             :  * attribute is in the middle of being created and should not be shown to
     573             :  * the user if we crash during the time that the bit is set.  We clear the
     574             :  * bit when we have finished setting up the attribute.  We do this because
     575             :  * we cannot create some large attributes inside a single transaction, and we
     576             :  * need some indication that we weren't finished if we crash in the middle.
     577             :  */
     578             : #define XFS_ATTR_LEAF_MAPSIZE   3       /* how many freespace slots */
     579             : 
     580             : /*
     581             :  * Entries are packed toward the top as tight as possible.
     582             :  */
     583             : struct xfs_attr_shortform {
     584             :         struct xfs_attr_sf_hdr {        /* constant-structure header block */
     585             :                 __be16  totsize;        /* total bytes in shortform list */
     586             :                 __u8    count;  /* count of active entries */
     587             :                 __u8    padding;
     588             :         } hdr;
     589             :         struct xfs_attr_sf_entry {
     590             :                 uint8_t namelen;        /* actual length of name (no NULL) */
     591             :                 uint8_t valuelen;       /* actual length of value (no NULL) */
     592             :                 uint8_t flags;  /* flags bits (see xfs_attr_leaf.h) */
     593             :                 uint8_t nameval[];      /* name & value bytes concatenated */
     594             :         } list[];                       /* variable sized array */
     595             : };
     596             : 
     597             : typedef struct xfs_attr_leaf_map {      /* RLE map of free bytes */
     598             :         __be16  base;                     /* base of free region */
     599             :         __be16  size;                     /* length of free region */
     600             : } xfs_attr_leaf_map_t;
     601             : 
     602             : typedef struct xfs_attr_leaf_hdr {      /* constant-structure header block */
     603             :         xfs_da_blkinfo_t info;          /* block type, links, etc. */
     604             :         __be16  count;                  /* count of active leaf_entry's */
     605             :         __be16  usedbytes;              /* num bytes of names/values stored */
     606             :         __be16  firstused;              /* first used byte in name area */
     607             :         __u8    holes;                  /* != 0 if blk needs compaction */
     608             :         __u8    pad1;
     609             :         xfs_attr_leaf_map_t freemap[XFS_ATTR_LEAF_MAPSIZE];
     610             :                                         /* N largest free regions */
     611             : } xfs_attr_leaf_hdr_t;
     612             : 
     613             : typedef struct xfs_attr_leaf_entry {    /* sorted on key, not name */
     614             :         __be32  hashval;                /* hash value of name */
     615             :         __be16  nameidx;                /* index into buffer of name/value */
     616             :         __u8    flags;                  /* LOCAL/ROOT/SECURE/INCOMPLETE flag */
     617             :         __u8    pad2;                   /* unused pad byte */
     618             : } xfs_attr_leaf_entry_t;
     619             : 
     620             : typedef struct xfs_attr_leaf_name_local {
     621             :         __be16  valuelen;               /* number of bytes in value */
     622             :         __u8    namelen;                /* length of name bytes */
     623             :         /*
     624             :          * In Linux 6.5 this flex array was converted from nameval[1] to
     625             :          * nameval[].  Be very careful here about extra padding at the end;
     626             :          * see xfs_attr_leaf_entsize_local() for details.
     627             :          */
     628             :         __u8    nameval[];              /* name/value bytes */
     629             : } xfs_attr_leaf_name_local_t;
     630             : 
     631             : typedef struct xfs_attr_leaf_name_remote {
     632             :         __be32  valueblk;               /* block number of value bytes */
     633             :         __be32  valuelen;               /* number of bytes in value */
     634             :         __u8    namelen;                /* length of name bytes */
     635             :         /*
     636             :          * In Linux 6.5 this flex array was converted from name[1] to name[].
     637             :          * Be very careful here about extra padding at the end; see
     638             :          * xfs_attr_leaf_entsize_remote() for details.
     639             :          */
     640             :         __u8    name[];                 /* name bytes */
     641             : } xfs_attr_leaf_name_remote_t;
     642             : 
     643             : typedef struct xfs_attr_leafblock {
     644             :         xfs_attr_leaf_hdr_t     hdr;    /* constant-structure header block */
     645             :         xfs_attr_leaf_entry_t   entries[];      /* sorted on key, not name */
     646             :         /*
     647             :          * The rest of the block contains the following structures after the
     648             :          * leaf entries, growing from the bottom up. The variables are never
     649             :          * referenced and definining them can actually make gcc optimize away
     650             :          * accesses to the 'entries' array above index 0 so don't do that.
     651             :          *
     652             :          * xfs_attr_leaf_name_local_t namelist;
     653             :          * xfs_attr_leaf_name_remote_t valuelist;
     654             :          */
     655             : } xfs_attr_leafblock_t;
     656             : 
     657             : /*
     658             :  * CRC enabled leaf structures. Called "version 3" structures to match the
     659             :  * version number of the directory and dablk structures for this feature, and
     660             :  * attr2 is already taken by the variable inode attribute fork size feature.
     661             :  */
     662             : struct xfs_attr3_leaf_hdr {
     663             :         struct xfs_da3_blkinfo  info;
     664             :         __be16                  count;
     665             :         __be16                  usedbytes;
     666             :         __be16                  firstused;
     667             :         __u8                    holes;
     668             :         __u8                    pad1;
     669             :         struct xfs_attr_leaf_map freemap[XFS_ATTR_LEAF_MAPSIZE];
     670             :         __be32                  pad2;           /* 64 bit alignment */
     671             : };
     672             : 
     673             : #define XFS_ATTR3_LEAF_CRC_OFF  (offsetof(struct xfs_attr3_leaf_hdr, info.crc))
     674             : 
     675             : struct xfs_attr3_leafblock {
     676             :         struct xfs_attr3_leaf_hdr       hdr;
     677             :         struct xfs_attr_leaf_entry      entries[];
     678             : 
     679             :         /*
     680             :          * The rest of the block contains the following structures after the
     681             :          * leaf entries, growing from the bottom up. The variables are never
     682             :          * referenced, the locations accessed purely from helper functions.
     683             :          *
     684             :          * struct xfs_attr_leaf_name_local
     685             :          * struct xfs_attr_leaf_name_remote
     686             :          */
     687             : };
     688             : 
     689             : /*
     690             :  * Special value to represent fs block size in the leaf header firstused field.
     691             :  * Only used when block size overflows the 2-bytes available on disk.
     692             :  */
     693             : #define XFS_ATTR3_LEAF_NULLOFF  0
     694             : 
     695             : /*
     696             :  * Flags used in the leaf_entry[i].flags field.
     697             :  */
     698             : #define XFS_ATTR_LOCAL_BIT      0       /* attr is stored locally */
     699             : #define XFS_ATTR_ROOT_BIT       1       /* limit access to trusted attrs */
     700             : #define XFS_ATTR_SECURE_BIT     2       /* limit access to secure attrs */
     701             : #define XFS_ATTR_INCOMPLETE_BIT 7       /* attr in middle of create/delete */
     702             : #define XFS_ATTR_LOCAL          (1u << XFS_ATTR_LOCAL_BIT)
     703             : #define XFS_ATTR_ROOT           (1u << XFS_ATTR_ROOT_BIT)
     704             : #define XFS_ATTR_SECURE         (1u << XFS_ATTR_SECURE_BIT)
     705             : #define XFS_ATTR_INCOMPLETE     (1u << XFS_ATTR_INCOMPLETE_BIT)
     706             : #define XFS_ATTR_NSP_ONDISK_MASK        (XFS_ATTR_ROOT | XFS_ATTR_SECURE)
     707             : 
     708             : /*
     709             :  * Alignment for namelist and valuelist entries (since they are mixed
     710             :  * there can be only one alignment value)
     711             :  */
     712             : #define XFS_ATTR_LEAF_NAME_ALIGN        ((uint)sizeof(xfs_dablk_t))
     713             : 
     714             : static inline int
     715             : xfs_attr3_leaf_hdr_size(struct xfs_attr_leafblock *leafp)
     716             : {
     717   361153273 :         if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC))
     718   361170070 :                 return sizeof(struct xfs_attr3_leaf_hdr);
     719             :         return sizeof(struct xfs_attr_leaf_hdr);
     720             : }
     721             : 
     722             : static inline struct xfs_attr_leaf_entry *
     723             : xfs_attr3_leaf_entryp(xfs_attr_leafblock_t *leafp)
     724             : {
     725  1124520956 :         if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC))
     726  7308214739 :                 return &((struct xfs_attr3_leafblock *)leafp)->entries[0];
     727           0 :         return &leafp->entries[0];
     728             : }
     729             : 
     730             : /*
     731             :  * Cast typed pointers for "local" and "remote" name/value structs.
     732             :  */
     733             : static inline char *
     734  6181927242 : xfs_attr3_leaf_name(xfs_attr_leafblock_t *leafp, int idx)
     735             : {
     736  6181927242 :         struct xfs_attr_leaf_entry *entries = xfs_attr3_leaf_entryp(leafp);
     737             : 
     738  6181927242 :         return &((char *)leafp)[be16_to_cpu(entries[idx].nameidx)];
     739             : }
     740             : 
     741             : static inline xfs_attr_leaf_name_remote_t *
     742             : xfs_attr3_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx)
     743             : {
     744        4224 :         return (xfs_attr_leaf_name_remote_t *)xfs_attr3_leaf_name(leafp, idx);
     745             : }
     746             : 
     747             : static inline xfs_attr_leaf_name_local_t *
     748             : xfs_attr3_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx)
     749             : {
     750  6045922307 :         return (xfs_attr_leaf_name_local_t *)xfs_attr3_leaf_name(leafp, idx);
     751             : }
     752             : 
     753             : /*
     754             :  * Calculate total bytes used (including trailing pad for alignment) for
     755             :  * a "local" name/value structure, a "remote" name/value structure, and
     756             :  * a pointer which might be either.
     757             :  */
     758             : static inline int xfs_attr_leaf_entsize_remote(int nlen)
     759             : {
     760             :         /*
     761             :          * Prior to Linux 6.5, struct xfs_attr_leaf_name_remote ended with
     762             :          * name[1], which was used as a flexarray.  The layout of this struct
     763             :          * is 9 bytes of fixed-length fields followed by a __u8 flex array at
     764             :          * offset 9.
     765             :          *
     766             :          * On most architectures, struct xfs_attr_leaf_name_remote had two
     767             :          * bytes of implicit padding at the end of the struct to make the
     768             :          * struct length 12.  After converting name[1] to name[], there are
     769             :          * three implicit padding bytes and the struct size remains 12.
     770             :          * However, there are compiler configurations that do not add implicit
     771             :          * padding at all (m68k) and have been broken for years.
     772             :          *
     773             :          * This entsize computation historically added (the xattr name length)
     774             :          * to (the padded struct length - 1) and rounded that sum up to the
     775             :          * nearest multiple of 4 (NAME_ALIGN).  IOWs, round_up(11 + nlen, 4).
     776             :          * This is encoded in the ondisk format, so we cannot change this.
     777             :          *
     778             :          * Compute the entsize from offsetof of the flexarray and manually
     779             :          * adding bytes for the implicit padding.
     780             :          */
     781        3774 :         const size_t remotesize =
     782             :                         offsetof(struct xfs_attr_leaf_name_remote, name) + 2;
     783             : 
     784        3774 :         return round_up(remotesize + nlen, XFS_ATTR_LEAF_NAME_ALIGN);
     785             : }
     786             : 
     787             : static inline int xfs_attr_leaf_entsize_local(int nlen, int vlen)
     788             : {
     789             :         /*
     790             :          * Prior to Linux 6.5, struct xfs_attr_leaf_name_local ended with
     791             :          * nameval[1], which was used as a flexarray.  The layout of this
     792             :          * struct is 3 bytes of fixed-length fields followed by a __u8 flex
     793             :          * array at offset 3.
     794             :          *
     795             :          * struct xfs_attr_leaf_name_local had zero bytes of implicit padding
     796             :          * at the end of the struct to make the struct length 4.  On most
     797             :          * architectures, after converting nameval[1] to nameval[], there is
     798             :          * one implicit padding byte and the struct size remains 4.  However,
     799             :          * there are compiler configurations that do not add implicit padding
     800             :          * at all (m68k) and would break.
     801             :          *
     802             :          * This entsize computation historically added (the xattr name and
     803             :          * value length) to (the padded struct length - 1) and rounded that sum
     804             :          * up to the nearest multiple of 4 (NAME_ALIGN).  IOWs, the formula is
     805             :          * round_up(3 + nlen + vlen, 4).  This is encoded in the ondisk format,
     806             :          * so we cannot change this.
     807             :          *
     808             :          * Compute the entsize from offsetof of the flexarray and manually
     809             :          * adding bytes for the implicit padding.
     810             :          */
     811   630402260 :         const size_t localsize =
     812             :                         offsetof(struct xfs_attr_leaf_name_local, nameval);
     813             : 
     814   630402260 :         return round_up(localsize + nlen + vlen, XFS_ATTR_LEAF_NAME_ALIGN);
     815             : }
     816             : 
     817             : static inline int xfs_attr_leaf_entsize_local_max(int bsize)
     818             : {
     819   232313413 :         return (((bsize) >> 1) + ((bsize) >> 2));
     820             : }
     821             : 
     822             : 
     823             : 
     824             : /*
     825             :  * Remote attribute block format definition
     826             :  *
     827             :  * There is one of these headers per filesystem block in a remote attribute.
     828             :  * This is done to ensure there is a 1:1 mapping between the attribute value
     829             :  * length and the number of blocks needed to store the attribute. This makes the
     830             :  * verification of a buffer a little more complex, but greatly simplifies the
     831             :  * allocation, reading and writing of these attributes as we don't have to guess
     832             :  * the number of blocks needed to store the attribute data.
     833             :  */
     834             : #define XFS_ATTR3_RMT_MAGIC     0x5841524d      /* XARM */
     835             : 
     836             : struct xfs_attr3_rmt_hdr {
     837             :         __be32  rm_magic;
     838             :         __be32  rm_offset;
     839             :         __be32  rm_bytes;
     840             :         __be32  rm_crc;
     841             :         uuid_t  rm_uuid;
     842             :         __be64  rm_owner;
     843             :         __be64  rm_blkno;
     844             :         __be64  rm_lsn;
     845             : };
     846             : 
     847             : #define XFS_ATTR3_RMT_CRC_OFF   offsetof(struct xfs_attr3_rmt_hdr, rm_crc)
     848             : 
     849             : #define XFS_ATTR3_RMT_BUF_SPACE(mp, bufsize)    \
     850             :         ((bufsize) - (xfs_has_crc((mp)) ? \
     851             :                         sizeof(struct xfs_attr3_rmt_hdr) : 0))
     852             : 
     853             : /* Number of bytes in a directory block. */
     854     1947374 : static inline unsigned int xfs_dir2_dirblock_bytes(struct xfs_sb *sbp)
     855             : {
     856     1947374 :         return 1 << (sbp->sb_blocklog + sbp->sb_dirblklog);
     857             : }
     858             : 
     859             : xfs_failaddr_t xfs_da3_blkinfo_verify(struct xfs_buf *bp,
     860             :                                       struct xfs_da3_blkinfo *hdr3);
     861             : 
     862             : #endif /* __XFS_DA_FORMAT_H__ */

Generated by: LCOV version 1.14