xfs: Simplify xfs_attr_leaf_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:12 +0000 (20:28 -0700)
Invert the rename logic in xfs_attr_leaf_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 82f7cc7..44288e4 100644 (file)
@@ -695,68 +695,71 @@ xfs_attr_leaf_addname(
                        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) {
+       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)
-                       return error;
-               /*
-                * Commit the flag value change and start the next trans in
-                * series.
+                * Added a "remote" value, just clear the incomplete flag.
                 */
-               error = xfs_trans_roll_inode(&args->trans, args->dp);
-               if (error)
-                       return error;
+               if (args->rmtblkno > 0)
+                       error = xfs_attr3_leaf_clearflag(args);
 
-               /*
-                * Dismantle the "old" attribute/value pair by removing
-                * a "remote" value (if it exists).
-                */
-               xfs_attr_restore_rmt_blk(args);
+               return error;
+       }
 
-               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_attr_rmtval_remove(args);
-                       if (error)
-                               return error;
-               }
+       error = xfs_attr3_leaf_flipflags(args);
+       if (error)
+               return error;
+       /*
+        * Commit the flag value change and start the next trans in series.
+        */
+       error = xfs_trans_roll_inode(&args->trans, args->dp);
+       if (error)
+               return error;
 
-               /*
-                * Read in the block containing the "old" attr, then
-                * remove the "old" attr from that block (neat, huh!)
-                */
-               error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno,
-                                          &bp);
+       /*
+        * Dismantle the "old" attribute/value pair by removing a "remote" value
+        * (if it exists).
+        */
+       xfs_attr_restore_rmt_blk(args);
+
+       if (args->rmtblkno) {
+               error = xfs_attr_rmtval_invalidate(args);
                if (error)
                        return error;
 
-               xfs_attr3_leaf_remove(bp, args);
-
-               /*
-                * If the result is small enough, shrink it all into the inode.
-                */
-               forkoff = xfs_attr_shortform_allfit(bp, dp);
-               if (forkoff)
-                       error = xfs_attr3_leaf_to_shortform(bp, args, forkoff);
-                       /* bp is gone due to xfs_da_shrink_inode */
-       } else if (args->rmtblkno > 0) {
-               /*
-                * Added a "remote" value, just clear the incomplete flag.
-                */
-               error = xfs_attr3_leaf_clearflag(args);
+               error = xfs_attr_rmtval_remove(args);
+               if (error)
+                       return error;
        }
+
+       /*
+        * Read in the block containing the "old" attr, then remove the "old"
+        * attr from that block (neat, huh!)
+        */
+       error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno,
+                                  &bp);
+       if (error)
+               return error;
+
+       xfs_attr3_leaf_remove(bp, args);
+
+       /*
+        * If the result is small enough, shrink it all into the inode.
+        */
+       forkoff = xfs_attr_shortform_allfit(bp, dp);
+       if (forkoff)
+               error = xfs_attr3_leaf_to_shortform(bp, args, forkoff);
+               /* bp is gone due to xfs_da_shrink_inode */
+
        return error;
 }