OSDN Git Service

xfs: factor out a xfs_attr_match helper
authorChristoph Hellwig <hch@lst.de>
Thu, 27 Feb 2020 01:30:36 +0000 (17:30 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Tue, 3 Mar 2020 04:55:53 +0000 (20:55 -0800)
Factor out a helper that compares an on-disk attr vs the name, length and
flags specified in struct xfs_da_args.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Chandan Rajendra <chandanrlinux@gmail.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/libxfs/xfs_attr_leaf.c

index b0658eb..8852754 100644 (file)
@@ -445,14 +445,21 @@ xfs_attr3_leaf_read(
  * Namespace helper routines
  *========================================================================*/
 
-/*
- * If namespace bits don't match return 0.
- * If all match then return 1.
- */
-STATIC int
-xfs_attr_namesp_match(int arg_flags, int ondisk_flags)
+static bool
+xfs_attr_match(
+       struct xfs_da_args      *args,
+       uint8_t                 namelen,
+       unsigned char           *name,
+       int                     flags)
 {
-       return XFS_ATTR_NSP_ONDISK(ondisk_flags) == XFS_ATTR_NSP_ARGS_TO_ONDISK(arg_flags);
+       if (args->namelen != namelen)
+               return false;
+       if (memcmp(args->name, name, namelen) != 0)
+               return false;
+       if (XFS_ATTR_NSP_ARGS_TO_ONDISK(args->flags) !=
+           XFS_ATTR_NSP_ONDISK(flags))
+               return false;
+       return true;
 }
 
 static int
@@ -678,15 +685,8 @@ xfs_attr_shortform_add(xfs_da_args_t *args, int forkoff)
        sf = (xfs_attr_shortform_t *)ifp->if_u1.if_data;
        sfe = &sf->list[0];
        for (i = 0; i < sf->hdr.count; sfe = XFS_ATTR_SF_NEXTENTRY(sfe), i++) {
-#ifdef DEBUG
-               if (sfe->namelen != args->namelen)
-                       continue;
-               if (memcmp(args->name, sfe->nameval, args->namelen) != 0)
-                       continue;
-               if (!xfs_attr_namesp_match(args->flags, sfe->flags))
-                       continue;
-               ASSERT(0);
-#endif
+               ASSERT(!xfs_attr_match(args, sfe->namelen, sfe->nameval,
+                       sfe->flags));
        }
 
        offset = (char *)sfe - (char *)sf;
@@ -749,13 +749,9 @@ xfs_attr_shortform_remove(xfs_da_args_t *args)
        for (i = 0; i < end; sfe = XFS_ATTR_SF_NEXTENTRY(sfe),
                                        base += size, i++) {
                size = XFS_ATTR_SF_ENTSIZE(sfe);
-               if (sfe->namelen != args->namelen)
-                       continue;
-               if (memcmp(sfe->nameval, args->name, args->namelen) != 0)
-                       continue;
-               if (!xfs_attr_namesp_match(args->flags, sfe->flags))
-                       continue;
-               break;
+               if (xfs_attr_match(args, sfe->namelen, sfe->nameval,
+                               sfe->flags))
+                       break;
        }
        if (i == end)
                return -ENOATTR;
@@ -816,13 +812,9 @@ xfs_attr_shortform_lookup(xfs_da_args_t *args)
        sfe = &sf->list[0];
        for (i = 0; i < sf->hdr.count;
                                sfe = XFS_ATTR_SF_NEXTENTRY(sfe), i++) {
-               if (sfe->namelen != args->namelen)
-                       continue;
-               if (memcmp(args->name, sfe->nameval, args->namelen) != 0)
-                       continue;
-               if (!xfs_attr_namesp_match(args->flags, sfe->flags))
-                       continue;
-               return -EEXIST;
+               if (xfs_attr_match(args, sfe->namelen, sfe->nameval,
+                               sfe->flags))
+                       return -EEXIST;
        }
        return -ENOATTR;
 }
@@ -847,14 +839,10 @@ xfs_attr_shortform_getvalue(
        sfe = &sf->list[0];
        for (i = 0; i < sf->hdr.count;
                                sfe = XFS_ATTR_SF_NEXTENTRY(sfe), i++) {
-               if (sfe->namelen != args->namelen)
-                       continue;
-               if (memcmp(args->name, sfe->nameval, args->namelen) != 0)
-                       continue;
-               if (!xfs_attr_namesp_match(args->flags, sfe->flags))
-                       continue;
-               return xfs_attr_copy_value(args, &sfe->nameval[args->namelen],
-                                               sfe->valuelen);
+               if (xfs_attr_match(args, sfe->namelen, sfe->nameval,
+                               sfe->flags))
+                       return xfs_attr_copy_value(args,
+                               &sfe->nameval[args->namelen], sfe->valuelen);
        }
        return -ENOATTR;
 }
@@ -2409,23 +2397,15 @@ xfs_attr3_leaf_lookup_int(
                }
                if (entry->flags & XFS_ATTR_LOCAL) {
                        name_loc = xfs_attr3_leaf_name_local(leaf, probe);
-                       if (name_loc->namelen != args->namelen)
-                               continue;
-                       if (memcmp(args->name, name_loc->nameval,
-                                                       args->namelen) != 0)
-                               continue;
-                       if (!xfs_attr_namesp_match(args->flags, entry->flags))
+                       if (!xfs_attr_match(args, name_loc->namelen,
+                                       name_loc->nameval, entry->flags))
                                continue;
                        args->index = probe;
                        return -EEXIST;
                } else {
                        name_rmt = xfs_attr3_leaf_name_remote(leaf, probe);
-                       if (name_rmt->namelen != args->namelen)
-                               continue;
-                       if (memcmp(args->name, name_rmt->name,
-                                                       args->namelen) != 0)
-                               continue;
-                       if (!xfs_attr_namesp_match(args->flags, entry->flags))
+                       if (!xfs_attr_match(args, name_rmt->namelen,
+                                       name_rmt->name, entry->flags))
                                continue;
                        args->index = probe;
                        args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen);