]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: check the flags earlier in xfs_attr_match
authorChristoph Hellwig <hch@lst.de>
Mon, 29 Jul 2024 23:22:45 +0000 (16:22 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 30 Jul 2024 00:01:02 +0000 (17:01 -0700)
Source kernel commit: f49af061f49c004fb6df7f791f39f9ed370f767b

Checking the flags match is much cheaper than a memcmp, so do it early
on in xfs_attr_match, and also add a little helper to calculate the
match mask right under the comment explaining the logic for it.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
libxfs/xfs_attr_leaf.c

index a3859961f6056e1d8db1b12594451f180d9d0014..c6322fbd2e7f2a2e999d618c34a349d88fe01fde 100644 (file)
@@ -504,6 +504,13 @@ xfs_attr3_leaf_read(
  * INCOMPLETE flag will not be set in attr->attr_filter, but rather
  * XFS_DA_OP_RECOVERY will be set in args->op_flags.
  */
+static inline unsigned int xfs_attr_match_mask(const struct xfs_da_args *args)
+{
+       if (args->op_flags & XFS_DA_OP_RECOVERY)
+               return XFS_ATTR_NSP_ONDISK_MASK;
+       return XFS_ATTR_NSP_ONDISK_MASK | XFS_ATTR_INCOMPLETE;
+}
+
 static bool
 xfs_attr_match(
        struct xfs_da_args      *args,
@@ -511,21 +518,15 @@ xfs_attr_match(
        const unsigned char     *name,
        unsigned int            namelen)
 {
+       unsigned int            mask = xfs_attr_match_mask(args);
 
        if (args->namelen != namelen)
                return false;
+       if ((args->attr_filter & mask) != (attr_flags & mask))
+               return false;
        if (memcmp(args->name, name, namelen) != 0)
                return false;
 
-       /* Recovery ignores the INCOMPLETE flag. */
-       if ((args->op_flags & XFS_DA_OP_RECOVERY) &&
-           args->attr_filter == (attr_flags & XFS_ATTR_NSP_ONDISK_MASK))
-               return true;
-
-       /* All remaining matches need to be filtered by INCOMPLETE state. */
-       if (args->attr_filter !=
-           (attr_flags & (XFS_ATTR_NSP_ONDISK_MASK | XFS_ATTR_INCOMPLETE)))
-               return false;
        return true;
 }