]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfs: don't increment m_generation for all errors in xfs_growfs_data
authorChristoph Hellwig <hch@lst.de>
Mon, 17 Mar 2025 05:44:53 +0000 (06:44 +0100)
committerCarlos Maiolino <cem@kernel.org>
Tue, 18 Mar 2025 12:06:00 +0000 (13:06 +0100)
xfs_growfs_data needs to increment m_generation as soon as the primary
superblock has been updated.  As the update of the secondary superblocks
was part of xfs_growfs_data_private that mean the incremented had to be
done unconditionally once that was called.  Later, commit 83a7f86e39ff
("xfs: separate secondary sb update in growfs") split the secondary
superblock update into a separate helper, so now the increment on error
can be limited to failed calls to xfs_update_secondary_sbs.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
fs/xfs/xfs_fsops.c

index d7658b7dcdbd084e0dbc8eba78eb054cca421251..b6f3d7abdae52e7f32f10a8482c4e9d519535432 100644 (file)
@@ -311,20 +311,20 @@ xfs_growfs_data(
        /* we can't grow the data section when an internal RT section exists */
        if (in->newblocks != mp->m_sb.sb_dblocks && mp->m_sb.sb_rtstart) {
                error = -EINVAL;
-               goto out_error;
+               goto out_unlock;
        }
 
        /* update imaxpct separately to the physical grow of the filesystem */
        if (in->imaxpct != mp->m_sb.sb_imax_pct) {
                error = xfs_growfs_imaxpct(mp, in->imaxpct);
                if (error)
-                       goto out_error;
+                       goto out_unlock;
        }
 
        if (in->newblocks != mp->m_sb.sb_dblocks) {
                error = xfs_growfs_data_private(mp, in);
                if (error)
-                       goto out_error;
+                       goto out_unlock;
        }
 
        /* Post growfs calculations needed to reflect new state in operations */
@@ -338,13 +338,12 @@ xfs_growfs_data(
        /* Update secondary superblocks now the physical grow has completed */
        error = xfs_update_secondary_sbs(mp);
 
-out_error:
        /*
-        * Increment the generation unconditionally, the error could be from
-        * updating the secondary superblocks, in which case the new size
-        * is live already.
+        * Increment the generation unconditionally, after trying to update the
+        * secondary superblocks, as the new size is live already at this point.
         */
        mp->m_generation++;
+out_unlock:
        mutex_unlock(&mp->m_growlock);
        return error;
 }