summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2023-06-05 04:07:27 +1000
committerDave Chinner <david@fromorbit.com>2023-06-05 04:07:27 +1000
commitcb042117488dbf0b3b38b05771639890fada9a52 (patch)
tree7f0a4368b50a39b7a1d893c2cddc26ac2fbd0160 /fs
parent00dcd17cfa7f103f7d640ffd34645a2ddab96330 (diff)
downloadlinux-cb042117488dbf0b3b38b05771639890fada9a52.tar.gz
linux-cb042117488dbf0b3b38b05771639890fada9a52.tar.bz2
linux-cb042117488dbf0b3b38b05771639890fada9a52.zip
xfs: defered work could create precommits
To fix a AGI-AGF-inode cluster buffer deadlock, we need to move inode cluster buffer operations to the ->iop_precommit() method. However, this means that deferred operations can require precommits to be run on the final transaction that the deferred ops pass back to xfs_trans_commit() context. This will be exposed by attribute handling, in that the last changes to the inode in the attr set state machine "disappear" because the precommit operation is not run. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dave Chinner <david@fromorbit.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/xfs/xfs_trans.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c
index 8afc0c080861..f81fbf081b01 100644
--- a/fs/xfs/xfs_trans.c
+++ b/fs/xfs/xfs_trans.c
@@ -970,6 +970,11 @@ __xfs_trans_commit(
error = xfs_defer_finish_noroll(&tp);
if (error)
goto out_unreserve;
+
+ /* Run precommits from final tx in defer chain. */
+ error = xfs_trans_run_precommits(tp);
+ if (error)
+ goto out_unreserve;
}
/*