summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2024-04-22 09:47:36 -0700
committerDarrick J. Wong <djwong@kernel.org>2024-04-23 07:46:55 -0700
commitf49af061f49c004fb6df7f791f39f9ed370f767b (patch)
tree25e0d1740db3b617bf78acb654e0aad6dec8dd28 /fs
parent63211876ced33fbb730f515e8d830de53533fc82 (diff)
downloadlinux-stable-f49af061f49c004fb6df7f791f39f9ed370f767b.tar.gz
linux-stable-f49af061f49c004fb6df7f791f39f9ed370f767b.tar.bz2
linux-stable-f49af061f49c004fb6df7f791f39f9ed370f767b.zip
xfs: check the flags earlier in xfs_attr_match
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>
Diffstat (limited to 'fs')
-rw-r--r--fs/xfs/libxfs/xfs_attr_leaf.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c
index bb00183d1349..c47fad39744e 100644
--- a/fs/xfs/libxfs/xfs_attr_leaf.c
+++ b/fs/xfs/libxfs/xfs_attr_leaf.c
@@ -507,6 +507,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,
@@ -514,21 +521,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;
}