|
@@ -377,9 +377,23 @@ xfs_log_commit_cil(
|
|
|
xfs_log_done(mp, tp->t_ticket, NULL, log_flags);
|
|
|
xfs_trans_unreserve_and_mod_sb(tp);
|
|
|
|
|
|
+ /*
|
|
|
+ * Once all the items of the transaction have been copied to the CIL,
|
|
|
+ * the items can be unlocked and freed.
|
|
|
+ *
|
|
|
+ * This needs to be done before we drop the CIL context lock because we
|
|
|
+ * have to update state in the log items and unlock them before they go
|
|
|
+ * to disk. If we don't, then the CIL checkpoint can race with us and
|
|
|
+ * we can run checkpoint completion before we've updated and unlocked
|
|
|
+ * the log items. This affects (at least) processing of stale buffers,
|
|
|
+ * inodes and EFIs.
|
|
|
+ */
|
|
|
+ xfs_trans_free_items(tp, *commit_lsn, 0);
|
|
|
+
|
|
|
/* check for background commit before unlock */
|
|
|
if (log->l_cilp->xc_ctx->space_used > XLOG_CIL_SPACE_LIMIT(log))
|
|
|
push = 1;
|
|
|
+
|
|
|
up_read(&log->l_cilp->xc_ctx_lock);
|
|
|
|
|
|
/*
|