summaryrefslogtreecommitdiffstats
path: root/fs/xfs
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2024-12-02 10:57:35 -0800
committerDarrick J. Wong <djwong@kernel.org>2024-12-12 17:45:11 -0800
commit3762113b597fa600d4e03300eec048256c546b1c (patch)
tree3fca367a93caaf98ac544d206927936f1b346561 /fs/xfs
parenta004afdc62946d3261f724c6472997085c4f0735 (diff)
downloadlinux-stable-3762113b597fa600d4e03300eec048256c546b1c.tar.gz
linux-stable-3762113b597fa600d4e03300eec048256c546b1c.tar.bz2
linux-stable-3762113b597fa600d4e03300eec048256c546b1c.zip
xfs: don't lose solo superblock counter update transactions
Superblock counter updates are tracked via per-transaction counters in the xfs_trans object. These changes are then turned into dirty log items in xfs_trans_apply_sb_deltas just prior to commiting the log items to the CIL. However, updating the per-transaction counter deltas do not cause XFS_TRANS_DIRTY to be set on the transaction. In other words, a pure sb counter update will be silently discarded if there are no other dirty log items attached to the transaction. This is currently not the case anywhere in the filesystem because sb counter updates always dirty at least one other metadata item, but let's not leave a logic bomb. Signed-off-by: "Darrick J. Wong" <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/xfs_trans.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c
index 26bb2343082a..427a8ba0ab99 100644
--- a/fs/xfs/xfs_trans.c
+++ b/fs/xfs/xfs_trans.c
@@ -860,6 +860,13 @@ __xfs_trans_commit(
trace_xfs_trans_commit(tp, _RET_IP_);
+ /*
+ * Commit per-transaction changes that are not already tracked through
+ * log items. This can add dirty log items to the transaction.
+ */
+ if (tp->t_flags & XFS_TRANS_SB_DIRTY)
+ xfs_trans_apply_sb_deltas(tp);
+
error = xfs_trans_run_precommits(tp);
if (error)
goto out_unreserve;
@@ -890,8 +897,6 @@ __xfs_trans_commit(
/*
* If we need to update the superblock, then do it now.
*/
- if (tp->t_flags & XFS_TRANS_SB_DIRTY)
- xfs_trans_apply_sb_deltas(tp);
xfs_trans_apply_dquot_deltas(tp);
xlog_cil_commit(log, tp, &commit_seq, regrant);