]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfs: rearrange xfs_da_args a bit to use less space
authorDarrick J. Wong <djwong@kernel.org>
Mon, 22 Apr 2024 16:47:23 +0000 (09:47 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 23 Apr 2024 14:46:51 +0000 (07:46 -0700)
A few notes about struct xfs_da_args:

The XFS_ATTR_* flags only go up as far as XFS_ATTR_INCOMPLETE, which
means that attr_filter could be a u8 field.

I've reduced the number of XFS_DA_OP_* flags down to the point where
op_flags would also fit into a u8.

filetype has 7 bytes of slack after it, which is wasteful.

namelen will never be greater than MAXNAMELEN, which is 256.  This field
could be reduced to a short.

Rearrange the fields in xfs_da_args to waste less space.  This reduces
the structure size from 136 bytes to 128.  Later when we add extra
fields to support parent pointer replacement, this will only bloat the
structure to 144 bytes, instead of 168.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/libxfs/xfs_da_btree.h

index 706b529a81febe25906c819040bf6a54ce2a0562..17cef594b5bbbd89ea2db736a2882321d2b682b3 100644 (file)
@@ -54,16 +54,20 @@ enum xfs_dacmp {
  */
 typedef struct xfs_da_args {
        struct xfs_da_geometry *geo;    /* da block geometry */
-       const uint8_t           *name;          /* string (maybe not NULL terminated) */
-       int             namelen;        /* length of string (maybe no NULL) */
-       uint8_t         filetype;       /* filetype of inode for directories */
+       const uint8_t   *name;          /* string (maybe not NULL terminated) */
        void            *value;         /* set of bytes (maybe contain NULLs) */
-       int             valuelen;       /* length of value */
-       unsigned int    attr_filter;    /* XFS_ATTR_{ROOT,SECURE,INCOMPLETE} */
-       xfs_dahash_t    hashval;        /* hash value of name */
-       xfs_ino_t       inumber;        /* input/output inode number */
        struct xfs_inode *dp;           /* directory inode to manipulate */
        struct xfs_trans *trans;        /* current trans (changes over time) */
+
+       xfs_ino_t       inumber;        /* input/output inode number */
+       xfs_ino_t       owner;          /* inode that owns the dir/attr data */
+
+       int             valuelen;       /* length of value */
+       uint8_t         filetype;       /* filetype of inode for directories */
+       uint8_t         op_flags;       /* operation flags */
+       uint8_t         attr_filter;    /* XFS_ATTR_{ROOT,SECURE,INCOMPLETE} */
+       short           namelen;        /* length of string (maybe no NULL) */
+       xfs_dahash_t    hashval;        /* hash value of name */
        xfs_extlen_t    total;          /* total blocks needed, for 1st bmap */
        int             whichfork;      /* data or attribute fork */
        xfs_dablk_t     blkno;          /* blkno of attr leaf of interest */
@@ -76,9 +80,7 @@ typedef struct xfs_da_args {
        xfs_dablk_t     rmtblkno2;      /* remote attr value starting blkno */
        int             rmtblkcnt2;     /* remote attr value block count */
        int             rmtvaluelen2;   /* remote attr value length in bytes */
-       uint32_t        op_flags;       /* operation flags */
        enum xfs_dacmp  cmpresult;      /* name compare result for lookups */
-       xfs_ino_t       owner;          /* inode that owns the dir/attr data */
 } xfs_da_args_t;
 
 /*