summaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_refcount_item.c
diff options
context:
space:
mode:
authorBrian Foster <bfoster@redhat.com>2018-07-12 07:26:09 +0200
committerDarrick J. Wong <darrick.wong@oracle.com>2018-07-12 07:26:09 +0200
commit813d08cb6de0af43da40393aebff914d2de9e50e (patch)
tree1b24780e3f956f490b73b4c337f66537b6f0879f /fs/xfs/xfs_refcount_item.c
parentxfs: remove dfops param from high level dirname calls (diff)
downloadlinux-813d08cb6de0af43da40393aebff914d2de9e50e.tar.xz
linux-813d08cb6de0af43da40393aebff914d2de9e50e.zip
xfs: use ->t_dfops for recovery of [b|c]ui log items
Log recovery passes down a central dfops structure to recovery handlers for bui and cui log items. Each of these handlers allocates and commits a transaction and defers any remaining operations to be completed by the main recovery sequence. Since dfops outlives the transaction in this context, set and clear ->t_dfops appropriately such that the *_finish_item() paths and below (i.e., xfs_bmapi*()) can expect to find the dfops in the transaction without it being committed with the dfops attached. This is required because transaction commit expects that an associated dfops is finished and in this context the dfops may be populated at commit time. Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Diffstat (limited to 'fs/xfs/xfs_refcount_item.c')
-rw-r--r--fs/xfs/xfs_refcount_item.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/fs/xfs/xfs_refcount_item.c b/fs/xfs/xfs_refcount_item.c
index 472a73e9d331..2064c689bc72 100644
--- a/fs/xfs/xfs_refcount_item.c
+++ b/fs/xfs/xfs_refcount_item.c
@@ -452,6 +452,7 @@ xfs_cui_recover(
mp->m_refc_maxlevels * 2, 0, XFS_TRANS_RESERVE, &tp);
if (error)
return error;
+ tp->t_dfops = dfops;
cudp = xfs_trans_get_cud(tp, cuip);
for (i = 0; i < cuip->cui_format.cui_nextents; i++) {
@@ -514,11 +515,18 @@ xfs_cui_recover(
xfs_refcount_finish_one_cleanup(tp, rcur, error);
set_bit(XFS_CUI_RECOVERED, &cuip->cui_flags);
+ /*
+ * Recovery finishes all deferred ops once intent processing is
+ * complete. Reset the trans reference because commit expects a finished
+ * dfops or none at all.
+ */
+ tp->t_dfops = NULL;
error = xfs_trans_commit(tp);
return error;
abort_error:
xfs_refcount_finish_one_cleanup(tp, rcur, error);
+ tp->t_dfops = NULL;
xfs_trans_cancel(tp);
return error;
}