[Concept,02/14] linux: jbd2: Add synchronous commit on transaction stop

Message ID 20251230205157.3383926-3-sjg@u-boot.org
State New
Headers
Series ext4l: Linux adaptation patches for ext4 write support |

Commit Message

Simon Glass Dec. 30, 2025, 8:51 p.m. UTC
  From: Simon Glass <simon.glass@canonical.com>

U-Boot operates in a single-threaded environment without a journal
daemon. Commit transactions synchronously when jbd2_journal_stop()
is called and there are no active handles (t_updates == 0).

This ensures crash-safety by writing journal entries to disk immediately
after each file-operation completes.

Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---

 fs/jbd2/transaction.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
  

Patch

diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c
index a524f490c79..b997c8495f5 100644
--- a/fs/jbd2/transaction.c
+++ b/fs/jbd2/transaction.c
@@ -1938,6 +1938,24 @@  int jbd2_journal_stop(handle_t *handle)
 	 */
 	stop_this_handle(handle);
 
+#ifdef __UBOOT__
+	/*
+	 * U-Boot: Always commit synchronously for crash safety.
+	 * In single-threaded mode, we commit immediately after each
+	 * operation completes to ensure durability.
+	 */
+	if (IS_ENABLED(CONFIG_EXT4_WRITE) &&
+	    journal->j_running_transaction &&
+	    atomic_read(&journal->j_running_transaction->t_updates) == 0) {
+		jbd2_journal_commit_transaction(journal);
+		/*
+		 * Check if journal was aborted during commit
+		 * (e.g., due to I/O error) and propagate the error.
+		 */
+		if (is_journal_aborted(journal) && !err)
+			err = -EIO;
+	} else
+#endif
 	if (wait_for_commit)
 		err = jbd2_log_wait_commit(journal, tid);