xfs: Simplify xfs_attr_node_addname
authorAllison Collins <allison.henderson@oracle.com>
Tue, 21 Jul 2020 04:47:31 +0000 (21:47 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 29 Jul 2020 03:28:13 +0000 (20:28 -0700)
Invert the rename logic in xfs_attr_node_addname to simplify the
delayed attr logic later.

Signed-off-by: Allison Collins <allison.henderson@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
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>
fs/xfs/libxfs/xfs_attr.c

index 44288e4baea7d6c25c1524763bae422b2a9956d1..cdfc136b5bfb992b3a08784c74951c3dfb3712a8 100644 (file)
@@ -1025,79 +1025,75 @@ restart:
                        return error;
        }
 
-       /*
-        * If this is an atomic rename operation, we must "flip" the
-        * incomplete flags on the "new" and "old" attribute/value pairs
-        * so that one disappears and one appears atomically.  Then we
-        * must remove the "old" attribute/value pair.
-        */
-       if (args->op_flags & XFS_DA_OP_RENAME) {
-               /*
-                * In a separate transaction, set the incomplete flag on the
-                * "old" attr and clear the incomplete flag on the "new" attr.
-                */
-               error = xfs_attr3_leaf_flipflags(args);
-               if (error)
-                       goto out;
-               /*
-                * Commit the flag value change and start the next trans in
-                * series
-                */
-               error = xfs_trans_roll_inode(&args->trans, args->dp);
-               if (error)
-                       goto out;
-
+       if (!(args->op_flags & XFS_DA_OP_RENAME)) {
                /*
-                * Dismantle the "old" attribute/value pair by removing
-                * a "remote" value (if it exists).
+                * Added a "remote" value, just clear the incomplete flag.
                 */
-               xfs_attr_restore_rmt_blk(args);
+               if (args->rmtblkno > 0)
+                       error = xfs_attr3_leaf_clearflag(args);
+               retval = error;
+               goto out;
+       }
 
-               if (args->rmtblkno) {
-                       error = xfs_attr_rmtval_invalidate(args);
-                       if (error)
-                               return error;
+       /*
+        * If this is an atomic rename operation, we must "flip" the incomplete
+        * flags on the "new" and "old" attribute/value pairs so that one
+        * disappears and one appears atomically.  Then we must remove the "old"
+        * attribute/value pair.
+        *
+        * In a separate transaction, set the incomplete flag on the "old" attr
+        * and clear the incomplete flag on the "new" attr.
+        */
+       error = xfs_attr3_leaf_flipflags(args);
+       if (error)
+               goto out;
+       /*
+        * Commit the flag value change and start the next trans in series
+        */
+       error = xfs_trans_roll_inode(&args->trans, args->dp);
+       if (error)
+               goto out;
 
-                       error = xfs_attr_rmtval_remove(args);
-                       if (error)
-                               return error;
-               }
+       /*
+        * Dismantle the "old" attribute/value pair by removing a "remote" value
+        * (if it exists).
+        */
+       xfs_attr_restore_rmt_blk(args);
 
-               /*
-                * Re-find the "old" attribute entry after any split ops.
-                * The INCOMPLETE flag means that we will find the "old"
-                * attr, not the "new" one.
-                */
-               args->attr_filter |= XFS_ATTR_INCOMPLETE;
-               state = xfs_da_state_alloc(args);
+       if (args->rmtblkno) {
+               error = xfs_attr_rmtval_invalidate(args);
+               if (error)
+                       return error;
 
-               state->inleaf = 0;
-               error = xfs_da3_node_lookup_int(state, &retval);
+               error = xfs_attr_rmtval_remove(args);
                if (error)
-                       goto out;
+                       return error;
+       }
 
-               /*
-                * Remove the name and update the hashvals in the tree.
-                */
-               blk = &state->path.blk[ state->path.active-1 ];
-               ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC);
-               error = xfs_attr3_leaf_remove(blk->bp, args);
-               xfs_da3_fixhashpath(state, &state->path);
+       /*
+        * Re-find the "old" attribute entry after any split ops. The INCOMPLETE
+        * flag means that we will find the "old" attr, not the "new" one.
+        */
+       args->attr_filter |= XFS_ATTR_INCOMPLETE;
+       state = xfs_da_state_alloc(args);
+       state->inleaf = 0;
+       error = xfs_da3_node_lookup_int(state, &retval);
+       if (error)
+               goto out;
 
-               /*
-                * Check to see if the tree needs to be collapsed.
-                */
-               if (retval && (state->path.active > 1)) {
-                       error = xfs_da3_join(state);
-                       if (error)
-                               goto out;
-               }
+       /*
+        * Remove the name and update the hashvals in the tree.
+        */
+       blk = &state->path.blk[state->path.active-1];
+       ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC);
+       error = xfs_attr3_leaf_remove(blk->bp, args);
+       xfs_da3_fixhashpath(state, &state->path);
 
-       } else if (args->rmtblkno > 0) {
-               /*
-                * Added a "remote" value, just clear the incomplete flag.
-                */
-               error = xfs_attr3_leaf_clearflag(args);
+       /*
+        * Check to see if the tree needs to be collapsed.
+        */
+       if (retval && (state->path.active > 1)) {
+               error = xfs_da3_join(state);
                if (error)
                        goto out;
        }