Currently there is a state where inside 
journal_commit_running_transaction_locked we move the running transaction to 
committing one, and then start waiting for the t_updates on the committing 
transaction to become 0 to proceed with the commit. In this gap, there is no 
running transaction
---
 ext2fs/journal.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/ext2fs/journal.c b/ext2fs/journal.c
index 5c4cc711a..d4097da89 100644
--- a/ext2fs/journal.c
+++ b/ext2fs/journal.c
@@ -2064,6 +2064,15 @@ journal_commit_running_transaction_locked (journal_t 
*journal)
 
   journal->j_committing_transaction = txn;
   journal->j_running_transaction = NULL;
+  if (!journal->j_must_exit)
+    {
+      /* Instantly spawn the next txn so that there is no gap. */
+      diskfs_transaction_t *run =
+       diskfs_journal_start_transaction_locked (journal);
+      if (run)
+       run->t_updates--;       /* We are just seeding it, not joining it! */
+    }
+
   txn->t_state = T_LOCKED;
 
   while (txn->t_updates > 0)
-- 
2.55.0


Reply via email to