]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: Return from xfs_attr_set_iter if there are no more rmtblks to process
authorAllison Henderson <allison.henderson@oracle.com>
Wed, 22 Jun 2022 19:28:52 +0000 (14:28 -0500)
committerEric Sandeen <sandeen@sandeen.net>
Wed, 22 Jun 2022 19:28:52 +0000 (14:28 -0500)
Source kernel commit: 9a39cdabc172ef2de3f21a34e73cdc1d02338d79

During an attr rename operation, blocks are saved for later removal
as rmtblkno2. The rmtblkno is used in the case of needing to alloc
more blocks if not enough were available.  However, in the case
that no further blocks need to be added or removed, we can return as soon
as xfs_attr_node_addname completes, rather than rolling the transaction
with an -EAGAIN return.  This extra loop does not hurt anything right
now, but it will be a problem later when we get into log items because
we end up with an empty log transaction.  So, add a simple check to
cut out the unneeded iteration.

Signed-off-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Dave Chinner <david@fromorbit.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/xfs_attr.c

index f08918024cf595c59c15ab39d86a053ca47abb0f..1450c221f8b6b0cc1bddc7dd34b5863bd3194745 100644 (file)
@@ -412,6 +412,14 @@ xfs_attr_set_iter(
                        if (error)
                                return error;
 
+                       /*
+                        * If addname was successful, and we dont need to alloc
+                        * or remove anymore blks, we're done.
+                        */
+                       if (!args->rmtblkno &&
+                           !(args->op_flags & XFS_DA_OP_RENAME))
+                               return 0;
+
                        dac->dela_state = XFS_DAS_FOUND_NBLK;
                }
                trace_xfs_attr_set_iter_return(dac->dela_state, args->dp);