[Concept,10/10] ext4l: Add fast_commit.c to build

Message ID 20251221113820.812060-11-sjg@u-boot.org
State New
Headers
Series ext4l: Add more ext4 files to the build (part E) |

Commit Message

Simon Glass Dec. 21, 2025, 11:38 a.m. UTC
  From: Simon Glass <simon.glass@canonical.com>

Add the fast commit module (fast_commit.c) to the build. This implements
ext4's fast commit journaling feature for improved performance.

Stubs added for:
- Wait bit operations (DEFINE_WAIT_BIT, bit_waitqueue, etc.)
- Dentry name snapshot operations
- Fast commit trace functions
- JBD2 fast commit functions (jbd2_fc_get_buf, jbd2_fc_begin_commit, etc.)
- Dentry allocation (d_alloc, d_drop)
- get_current_ioprio, wake_up_bit
- REQ_IDLE, REQ_PREFLUSH block I/O flags

Move name_snapshot struct definition after qstr is defined.

Remove fast commit stub functions now implemented in fast_commit.c.

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

 fs/ext4l/Makefile        |   2 +-
 fs/ext4l/ext4_uboot.h    |  82 ++++++++++++++++++++++++---
 fs/ext4l/fast_commit.c   |   6 +-
 fs/ext4l/stub.c          | 118 +++++++++++++++++++--------------------
 include/linux/seq_file.h |   6 +-
 5 files changed, 137 insertions(+), 77 deletions(-)
  

Patch

diff --git a/fs/ext4l/Makefile b/fs/ext4l/Makefile
index 3116ac3be39..4003a1f2317 100644
--- a/fs/ext4l/Makefile
+++ b/fs/ext4l/Makefile
@@ -11,4 +11,4 @@  obj-y	+= balloc.o bitmap.o block_validity.o dir.o ext4_jbd2.o extents.o \
 		namei.o page-io.o readpage.o \
 		super.o symlink.o xattr.o \
 		xattr_hurd.o xattr_trusted.o \
-		xattr_user.o orphan.o
+		xattr_user.o fast_commit.o orphan.o
diff --git a/fs/ext4l/ext4_uboot.h b/fs/ext4l/ext4_uboot.h
index a6ffc91b7de..82b68056953 100644
--- a/fs/ext4l/ext4_uboot.h
+++ b/fs/ext4l/ext4_uboot.h
@@ -114,11 +114,6 @@  struct rb_root {
 /* percpu_counter - use Linux header */
 #include <linux/percpu_counter.h>
 
-/* name_snapshot - stub */
-struct name_snapshot {
-	const char *name;
-};
-
 /* Project ID type */
 typedef struct { unsigned int val; } kprojid_t;
 
@@ -552,6 +547,11 @@  struct dentry {
 	struct dentry *d_parent;
 };
 
+/* name_snapshot - for dentry name snapshots */
+struct name_snapshot {
+	struct qstr name;
+};
+
 /* vm_fault_t - stub */
 typedef unsigned int vm_fault_t;
 
@@ -1968,10 +1968,6 @@  struct kstatfs {
 
 /* seq_file stubs */
 struct seq_file;
-#define seq_printf(m, fmt, ...)		do { } while (0)
-#define seq_puts(m, s)			do { } while (0)
-#define seq_putc(m, c)			do { } while (0)
-#define seq_escape(m, s, esc)		do { } while (0)
 
 /* Module stubs */
 struct module;
@@ -2704,4 +2700,72 @@  typedef void *mempool_t;
 #define block_read_full_folio(folio, get_block) \
 	({ (void)(folio); (void)(get_block); 0; })
 
+/*
+ * Stubs for fast_commit.c
+ */
+
+/* Wait bit operations - stubbed for single-threaded U-Boot */
+struct wait_bit_entry {
+	struct list_head wq_entry;
+};
+#define DEFINE_WAIT_BIT(name, word, bit) \
+	struct wait_bit_entry name = { }
+#define bit_waitqueue(word, bit) \
+	({ (void)(word); (void)(bit); (wait_queue_head_t *)NULL; })
+#define prepare_to_wait(wq, wait, state) \
+	do { (void)(wq); (void)(wait); (void)(state); } while (0)
+#define finish_wait(wq, wait) \
+	do { (void)(wq); (void)(wait); } while (0)
+
+/* Dentry name snapshot operations */
+#define take_dentry_name_snapshot(snap, dentry) \
+	do { (snap)->name = (dentry)->d_name; } while (0)
+#define release_dentry_name_snapshot(snap) \
+	do { (void)(snap); } while (0)
+
+/* Fast commit trace stubs */
+#define trace_ext4_fc_track_unlink(handle, inode, dentry, ret) \
+	do { (void)(handle); (void)(inode); (void)(dentry); (void)(ret); } while (0)
+#define trace_ext4_fc_track_link(handle, inode, dentry, ret) \
+	do { (void)(handle); (void)(inode); (void)(dentry); (void)(ret); } while (0)
+#define trace_ext4_fc_track_create(handle, inode, dentry, ret) \
+	do { (void)(handle); (void)(inode); (void)(dentry); (void)(ret); } while (0)
+#define trace_ext4_fc_track_inode(handle, inode, ret) \
+	do { (void)(handle); (void)(inode); (void)(ret); } while (0)
+#define trace_ext4_fc_track_range(handle, inode, start, end, ret) \
+	do { (void)(handle); (void)(inode); (void)(start); (void)(end); (void)(ret); } while (0)
+
+/* lockdep stubs */
+#define lockdep_assert_not_held(lock)	do { (void)(lock); } while (0)
+
+/* Request flags for block I/O */
+#define REQ_IDLE		0
+#define REQ_PREFLUSH		0
+
+/* Fast commit trace stubs */
+#define trace_ext4_fc_cleanup(sb, full, reason) \
+	do { (void)(sb); (void)(full); (void)(reason); } while (0)
+#define trace_ext4_fc_stats(sb) \
+	do { (void)(sb); } while (0)
+#define trace_ext4_fc_commit_start(sb, tid) \
+	do { (void)(sb); (void)(tid); } while (0)
+#define trace_ext4_fc_commit_stop(sb, nblks, status, tid) \
+	do { (void)(sb); (void)(nblks); (void)(status); (void)(tid); } while (0)
+
+/* wake_up_bit - wake up threads waiting on a bit */
+#define wake_up_bit(word, bit)		do { (void)(word); (void)(bit); } while (0)
+
+/* Dentry allocation stubs */
+#define d_alloc(parent, name)		({ (void)(parent); (void)(name); (struct dentry *)NULL; })
+#define d_drop(dentry)			do { (void)(dentry); } while (0)
+
+/* More fast commit trace stubs */
+#define trace_ext4_fc_replay_scan(sb, err, off) \
+	do { (void)(sb); (void)(err); (void)(off); } while (0)
+#define trace_ext4_fc_replay(sb, tag, ino, priv1, priv2) \
+	do { (void)(sb); (void)(tag); (void)(ino); (void)(priv1); (void)(priv2); } while (0)
+
+/* get_current_ioprio - I/O priority (not used in U-Boot) */
+#define get_current_ioprio()		(0)
+
 #endif /* __EXT4_UBOOT_H__ */
diff --git a/fs/ext4l/fast_commit.c b/fs/ext4l/fast_commit.c
index fa66b08de99..ea5be3a079c 100644
--- a/fs/ext4l/fast_commit.c
+++ b/fs/ext4l/fast_commit.c
@@ -7,12 +7,12 @@ 
  *
  * Ext4 fast commits routines.
  */
+#include "ext4_uboot.h"
+
 #include "ext4.h"
 #include "ext4_jbd2.h"
 #include "ext4_extents.h"
 #include "mballoc.h"
-
-#include <linux/lockdep.h>
 /*
  * Ext4 Fast Commits
  * -----------------
@@ -2291,7 +2291,7 @@  void ext4_fc_init(struct super_block *sb, journal_t *journal)
 	journal->j_fc_cleanup_callback = ext4_fc_cleanup;
 }
 
-static const char * const fc_ineligible_reasons[] = {
+static __maybe_unused const char * const fc_ineligible_reasons[] = {
 	[EXT4_FC_REASON_XATTR] = "Extended attributes changed",
 	[EXT4_FC_REASON_CROSS_RENAME] = "Cross rename",
 	[EXT4_FC_REASON_JOURNAL_FLAG_CHANGE] = "Journal flag changed",
diff --git a/fs/ext4l/stub.c b/fs/ext4l/stub.c
index 87637ecbd8c..2b2b777d1f2 100644
--- a/fs/ext4l/stub.c
+++ b/fs/ext4l/stub.c
@@ -175,10 +175,7 @@  struct extent_status;
 /* ext4_is_pending is now in extents_status.c */
 /* ext4_convert_inline_data is now in inline.c */
 
-void ext4_fc_mark_ineligible(struct super_block *sb, int reason,
-			     void *handle)
-{
-}
+/* ext4_fc_mark_ineligible is now in fast_commit.c */
 
 /* ext4_es_lookup_extent is now in extents_status.c */
 
@@ -188,17 +185,62 @@  void ext4_fc_mark_ineligible(struct super_block *sb, int reason,
 
 /* ext4_mb_mark_bb is now in mballoc.c */
 
-void ext4_fc_record_regions(struct super_block *sb, int ino,
-			    unsigned long lblk, unsigned long long pblk,
-			    int len, int mapped)
+/* ext4_fc_record_regions is now in fast_commit.c */
+
+/* ext4_fc_replay_check_excluded is now in fast_commit.c */
+
+/*
+ * JBD2 fast commit stubs
+ */
+int jbd2_fc_get_buf(void *journal, struct buffer_head **bh_out)
+{
+	*bh_out = NULL;
+	return -ENOSPC;
+}
+
+void jbd2_fc_release_bufs(void *journal)
 {
 }
 
-int ext4_fc_replay_check_excluded(struct super_block *sb, unsigned long long blk)
+int jbd2_fc_begin_commit(void *journal, unsigned int tid)
+{
+	return -EOPNOTSUPP;
+}
+
+int jbd2_fc_end_commit(void *journal)
 {
 	return 0;
 }
 
+int jbd2_fc_end_commit_fallback(void *journal)
+{
+	return 0;
+}
+
+int jbd2_submit_inode_data(void *journal, void *jinode)
+{
+	return 0;
+}
+
+int jbd2_wait_inode_data(void *journal, void *jinode)
+{
+	return 0;
+}
+
+int jbd2_fc_wait_bufs(void *journal, int num)
+{
+	return 0;
+}
+
+int jbd2_complete_transaction(void *journal, unsigned int tid)
+{
+	return 0;
+}
+
+void ext4_reset_inode_seed(struct inode *inode)
+{
+}
+
 /*
  * Stubs for page-io.c
  */
@@ -257,10 +299,7 @@  int jbd2_journal_inode_ranged_write(void *handle, struct inode *inode,
 /* ext4_read_bh_lock is now in super.c */
 
 /* Fast commit */
-int ext4_fc_commit(void *journal, unsigned int tid)
-{
-	return 0;
-}
+/* ext4_fc_commit is now in fast_commit.c */
 
 /* ext4_force_commit is now in super.c */
 
@@ -284,12 +323,7 @@  int jbd2_log_wait_commit(void *journal, unsigned int tid)
 	return 0;
 }
 
-/* Fast commit */
-void ext4_fc_track_range(void *handle, struct inode *inode,
-			 unsigned long long start, unsigned long long end)
-{
-}
-
+/* ext4_fc_track_range is now in fast_commit.c */
 
 /* JBD2 journal update locking */
 void jbd2_journal_lock_updates(void *journal)
@@ -306,14 +340,8 @@  int jbd2_journal_flush(void *journal, unsigned int flags)
 }
 
 
-/* Fast commit */
-void ext4_fc_track_inode(void *handle, struct inode *inode)
-{
-}
-
-void ext4_fc_init_inode(void **head, struct inode *inode)
-{
-}
+/* ext4_fc_track_inode is now in fast_commit.c */
+/* ext4_fc_init_inode is now in fast_commit.c */
 
 /* JBD2 */
 int jbd2_journal_inode_ranged_wait(void *handle, struct inode *inode,
@@ -372,33 +400,7 @@  ssize_t generic_read_dir(struct file *f, char *buf, size_t count, loff_t *ppos)
 
 /* Inline dir stubs are now in inline.c */
 
-/* Fast commit stubs */
-void ext4_fc_track_unlink(void *handle, struct dentry *dentry)
-{
-}
-
-void ext4_fc_track_link(void *handle, struct dentry *dentry)
-{
-}
-
-void ext4_fc_track_create(void *handle, struct dentry *dentry)
-{
-}
-
-void __ext4_fc_track_link(void *handle, struct inode *inode,
-			  struct dentry *dentry)
-{
-}
-
-void __ext4_fc_track_unlink(void *handle, struct inode *inode,
-			    struct dentry *dentry)
-{
-}
-
-void __ext4_fc_track_create(void *handle, struct inode *inode,
-			    struct dentry *dentry)
-{
-}
+/* Fast commit stubs are now in fast_commit.c */
 
 /* fileattr stubs */
 int ext4_fileattr_get(struct dentry *dentry, void *fa)
@@ -603,10 +605,7 @@  void set_task_ioprio(void *task, int ioprio)
 {
 }
 
-/* Fast commit */
-void ext4_fc_init(void *sb, void *journal)
-{
-}
+/* ext4_fc_init is now in fast_commit.c */
 
 /* Filesystem sync */
 int sync_filesystem(void *sb)
@@ -784,10 +783,7 @@  char *file_path(struct file *file, char *buf, int buflen)
 	return buf;
 }
 
-/* Fast commit delete */
-void ext4_fc_del(struct inode *inode)
-{
-}
+/* ext4_fc_del is now in fast_commit.c */
 
 /* invalidate_inode_buffers is now a macro in ext4_uboot.h */
 /* clear_inode is now a macro in ext4_uboot.h */
diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h
index 5b6495d1003..e4139f48e16 100644
--- a/include/linux/seq_file.h
+++ b/include/linux/seq_file.h
@@ -12,8 +12,8 @@  struct seq_file {
 	struct file *file;
 };
 
-#define seq_printf(m, fmt, ...)		do { } while (0)
-#define seq_puts(m, s)			do { } while (0)
-#define seq_putc(m, c)			do { } while (0)
+#define seq_printf(m, fmt, ...)		do { (void)(m); } while (0)
+#define seq_puts(m, s)			do { (void)(m); (void)(s); } while (0)
+#define seq_putc(m, c)			do { (void)(m); (void)(c); } while (0)
 
 #endif /* _LINUX_SEQ_FILE_H */