]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: Add helper function xfs_attr_node_removename_setup
authorAllison Collins <allison.henderson@oracle.com>
Tue, 15 Sep 2020 19:59:37 +0000 (15:59 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Tue, 15 Sep 2020 19:59:37 +0000 (15:59 -0400)
Source kernel commit: 674eb548cf0ced1487ee229f96af2c7cf0099d2a

This patch adds a new helper function xfs_attr_node_removename_setup.
This will help modularize xfs_attr_node_removename when we add delay
ready attributes later.

Signed-off-by: Allison Collins <allison.henderson@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Chandan Rajendra <chandanrlinux@gmail.com>
[darrick: fix unused variable complaints by 0day robot]
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Acked-by: Dave Chinner <dchinner@redhat.com>
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/xfs_attr.c

index bdc8d90a6b4ff6ff2dfd1372b2a2ce9471310d7b..509a4fcba1aeefea9d37c5ab91a47c00c4acfde0 100644 (file)
@@ -1167,6 +1167,37 @@ xfs_attr_leaf_mark_incomplete(
        return xfs_attr3_leaf_setflag(args);
 }
 
+/*
+ * Initial setup for xfs_attr_node_removename.  Make sure the attr is there and
+ * the blocks are valid.  Attr keys with remote blocks will be marked
+ * incomplete.
+ */
+STATIC
+int xfs_attr_node_removename_setup(
+       struct xfs_da_args      *args,
+       struct xfs_da_state     **state)
+{
+       int                     error;
+
+       error = xfs_attr_node_hasname(args, state);
+       if (error != -EEXIST)
+               return error;
+
+       ASSERT((*state)->path.blk[(*state)->path.active - 1].bp != NULL);
+       ASSERT((*state)->path.blk[(*state)->path.active - 1].magic ==
+               XFS_ATTR_LEAF_MAGIC);
+
+       if (args->rmtblkno > 0) {
+               error = xfs_attr_leaf_mark_incomplete(args, *state);
+               if (error)
+                       return error;
+
+               return xfs_attr_rmtval_invalidate(args);
+       }
+
+       return 0;
+}
+
 /*
  * Remove a name from a B-tree attribute list.
  *
@@ -1185,8 +1216,8 @@ xfs_attr_node_removename(
 
        trace_xfs_attr_node_removename(args);
 
-       error = xfs_attr_node_hasname(args, &state);
-       if (error != -EEXIST)
+       error = xfs_attr_node_removename_setup(args, &state);
+       if (error)
                goto out;
 
        /*
@@ -1194,18 +1225,7 @@ xfs_attr_node_removename(
         * This is done before we remove the attribute so that we don't
         * overflow the maximum size of a transaction and/or hit a deadlock.
         */
-       blk = &state->path.blk[ state->path.active-1 ];
-       ASSERT(blk->bp != NULL);
-       ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC);
        if (args->rmtblkno > 0) {
-               error = xfs_attr_leaf_mark_incomplete(args, state);
-               if (error)
-                       goto out;
-
-               error = xfs_attr_rmtval_invalidate(args);
-               if (error)
-                       return error;
-
                error = xfs_attr_rmtval_remove(args);
                if (error)
                        goto out;