Commit f49af061 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Darrick J. Wong
Browse files

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: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
parent 63211876
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -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;
}