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>
This commit is contained in:
parent
63211876ce
commit
f49af061f4
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user