[Concept,12/17] ext4l: Move inode stubs to proper headers

Message ID 20260120234344.495605-13-sjg@u-boot.org
State New
Headers
Series ext4l: Move compatibility stubs to standard Linux headers |

Commit Message

Simon Glass Jan. 20, 2026, 11:43 p.m. UTC
  From: Simon Glass <simon.glass@canonical.com>

Move inode-related stubs to their proper Linux headers:

- inode_io_list_del() to linux/writeback.h
- inode_is_open_for_write(), inode_is_dirtytime_only() to linux/fs.h
- icount_read(), i_uid_write(), i_gid_write(), inode_fsuid_set() to linux/fs.h
- inode_init_owner(), insert_inode_locked(), unlock_new_inode() to linux/fs.h
- clear_nlink(), set_nlink(), inc_nlink(), drop_nlink() to linux/fs.h
- IS_NOQUOTA(), IS_SWAPFILE() to linux/fs.h
- inode_set_ctime_current(), inode_set_mtime_to_ts(), inode_set_flags() to linux/fs.h
- inode_set_cached_link(), init_special_inode(), make_bad_inode() to linux/fs.h
- iget_failed(), find_inode_by_ino_rcu(), mark_inode_dirty() to linux/fs.h
- invalidate_inode_buffers(), clear_inode() to linux/fs.h
- i_uid_needs_update(), i_gid_needs_update(), i_uid_update(), i_gid_update()
- lock_two_nondirectories(), unlock_two_nondirectories() to linux/fs.h
- alloc_inode_sb(), inode_generic_drop() to linux/fs.h

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

 fs/ext4l/ext4_uboot.h     | 66 ++++++++++-----------------------------
 include/linux/fs.h        | 53 +++++++++++++++++++++++++++++++
 include/linux/writeback.h |  8 +++++
 3 files changed, 78 insertions(+), 49 deletions(-)
  

Patch

diff --git a/fs/ext4l/ext4_uboot.h b/fs/ext4l/ext4_uboot.h
index 4ec4d713eb4..49dd566262b 100644
--- a/fs/ext4l/ext4_uboot.h
+++ b/fs/ext4l/ext4_uboot.h
@@ -214,9 +214,7 @@ 
 /* Quota operations - use linux/quotaops.h */
 #include <linux/quotaops.h>
 
-/* icount - inode reference count */
-#define icount_read(inode)			(1)
-
+/* icount_read is in linux/fs.h */
 /* d_inode is now in linux/dcache.h */
 
 /* Random number functions - use linux/random.h */
@@ -228,13 +226,8 @@ 
 
 /* Inode operations - iget_locked and new_inode are in interface.c */
 extern struct inode *new_inode(struct super_block *sb);
-#define i_uid_write(inode, uid)			do { } while (0)
-#define i_gid_write(inode, gid)			do { } while (0)
-#define inode_fsuid_set(inode, idmap)		do { } while (0)
-#define inode_init_owner(idmap, i, dir, mode)	do { (i)->i_mode = (mode); } while (0)
-#define insert_inode_locked(inode)		(0)
-#define unlock_new_inode(inode)			do { } while (0)
-#define clear_nlink(inode)			do { } while (0)
+/* i_uid_write, i_gid_write, inode_fsuid_set, inode_init_owner are in linux/fs.h */
+/* insert_inode_locked, unlock_new_inode, clear_nlink are in linux/fs.h */
 /* IS_DIRSYNC is in linux/fs.h */
 
 /* fscrypt_prepare_new_inode, fscrypt_set_context are in ext4_fscrypt.h */
@@ -335,9 +328,7 @@  BUFFER_FNS(Cached, cached)
 /* errseq_t is defined in linux/fs.h */
 /* time64_t is now in linux/time.h */
 
-/* IS_NOQUOTA - stub */
-#define IS_NOQUOTA(inode)	(0)
-
+/* IS_NOQUOTA is in linux/fs.h */
 /* dentry, name_snapshot are now in linux/dcache.h */
 
 /* VM types - use linux/mm_types.h */
@@ -640,8 +631,7 @@  struct dx_hash_info {
 #define daxdev_mapping_supported(f, i, d) ({ (void)(f); (void)(i); (void)(d); 1; })
 
 /* Inode time/size operations - inode_newsize_ok, i_blocksize, IS_SYNC are in linux/fs.h */
-#define inode_set_ctime_current(i)	({ (void)(i); (struct timespec64){}; })
-#define inode_set_mtime_to_ts(i, ts)	({ (void)(i); (ts); })
+/* inode_set_ctime_current, inode_set_mtime_to_ts are in linux/fs.h */
 
 /* Case-folding stubs - not supported in U-Boot */
 #define sb_no_casefold_compat_fallback(sb)	({ (void)(sb); 1; })
@@ -754,10 +744,8 @@  void mapping_clear_folio_cache(struct address_space *mapping);
 
 /* dquot_file_open is in linux/quotaops.h */
 
-/* Inode I/O list management */
-#define inode_io_list_del(inode)		do { } while (0)
-#define inode_is_open_for_write(i)		(0)
-#define inode_is_dirtytime_only(i)		(0)
+/* inode_io_list_del is in linux/writeback.h */
+/* inode_is_open_for_write, inode_is_dirtytime_only are in linux/fs.h */
 
 /* Folio operations and writeback stubs are in linux/pagemap.h */
 #define folio_batch_release(fb)			do { } while (0)
@@ -805,9 +793,9 @@  static inline struct timespec64 inode_set_ctime_to_ts(struct inode *inode,
 
 /* Inode version operations - use linux/iversion.h */
 #include <linux/iversion.h>
-#define inode_set_flags(i, f, m)		do { } while (0)
+/* inode_set_flags is in linux/fs.h */
 
-/* Inode credential helpers */
+/* Inode credential helpers - i_uid_read, i_gid_read need struct inode */
 static inline unsigned int i_uid_read(const struct inode *inode)
 {
 	return inode->i_uid.val;
@@ -818,10 +806,7 @@  static inline unsigned int i_gid_read(const struct inode *inode)
 	return inode->i_gid.val;
 }
 
-#define i_uid_needs_update(m, a, i)		({ (void)(m); (void)(a); (void)(i); 0; })
-#define i_gid_needs_update(m, a, i)		({ (void)(m); (void)(a); (void)(i); 0; })
-#define i_uid_update(m, a, i)			do { } while (0)
-#define i_gid_update(m, a, i)			do { } while (0)
+/* i_uid_needs_update, i_gid_needs_update, i_uid_update, i_gid_update are in linux/fs.h */
 
 /* Device encoding helpers are now in linux/kdev_t.h */
 #include <linux/kdev_t.h>
@@ -831,15 +816,9 @@  static inline unsigned int i_gid_read(const struct inode *inode)
 
 /* Inode allocation/state operations */
 extern struct inode *iget_locked(struct super_block *sb, unsigned long ino);
-#define set_nlink(i, n)			do { (i)->i_nlink = (n); } while (0)
-#define inc_nlink(i)			do { (i)->i_nlink++; } while (0)
-#define drop_nlink(i)			do { (i)->i_nlink--; } while (0)
-#define inode_set_cached_link(i, l, len) do { } while (0)
-#define init_special_inode(i, m, d)	do { } while (0)
-#define make_bad_inode(i)		do { } while (0)
-#define iget_failed(i)			do { } while (0)
-#define find_inode_by_ino_rcu(sb, ino)	((struct inode *)NULL)
-#define mark_inode_dirty(i)		do { } while (0)
+/* set_nlink, inc_nlink, drop_nlink are in linux/fs.h */
+/* inode_set_cached_link, init_special_inode, make_bad_inode are in linux/fs.h */
+/* iget_failed, find_inode_by_ino_rcu, mark_inode_dirty are in linux/fs.h */
 
 /* Attribute operations */
 #define setattr_prepare(m, d, a)	({ (void)(m); (void)(d); (void)(a); 0; })
@@ -1118,11 +1097,8 @@  void fs_put_dax(void *dax, void *holder);
 
 /* fscrypt declarations are in ext4_fscrypt.h */
 
-/* Inode allocation - declaration for stub.c */
-void *alloc_inode_sb(struct super_block *sb, struct kmem_cache *cache,
-		     gfp_t gfp);
+/* alloc_inode_sb, inode_generic_drop are in linux/fs.h */
 /* inode_set_iversion is in linux/iversion.h */
-int inode_generic_drop(struct inode *inode);
 
 /* rwlock_init is a macro in linux/spinlock.h */
 
@@ -1130,10 +1106,7 @@  int inode_generic_drop(struct inode *inode);
 #define kmem_cache_create_usercopy(n, sz, al, fl, uo, us, c) \
 	kmem_cache_create(n, sz, al, fl, c)
 
-/* Inode buffer operations */
-#define invalidate_inode_buffers(i)	do { } while (0)
-#define clear_inode(i)			do { } while (0)
-
+/* invalidate_inode_buffers, clear_inode are in linux/fs.h */
 /* fsverity_cleanup_inode is in linux/fsverity.h */
 
 /* NFS export helpers are now in linux/exportfs.h */
@@ -1458,19 +1431,14 @@  loff_t seq_lseek(struct file *f, loff_t o, int w);
 
 /* filemap_release_folio is in linux/pagemap.h */
 
-/* IS_SWAPFILE - check if inode is a swap file */
-#define IS_SWAPFILE(inode)	({ (void)(inode); 0; })
+/* IS_SWAPFILE is in linux/fs.h */
 
 /* PAGE_MASK - mask for page alignment */
 #ifndef PAGE_MASK
 #define PAGE_MASK	(~(PAGE_SIZE - 1))
 #endif
 
-/* lock_two_nondirectories - lock two inodes in order */
-#define lock_two_nondirectories(i1, i2) \
-	do { (void)(i1); (void)(i2); } while (0)
-#define unlock_two_nondirectories(i1, i2) \
-	do { (void)(i1); (void)(i2); } while (0)
+/* lock_two_nondirectories, unlock_two_nondirectories are in linux/fs.h */
 
 /*
  * Stubs for resize.c
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 431dc0c513a..aac88e7c68c 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -314,6 +314,12 @@  enum {
 /* is_bad_inode - check if inode is marked bad (always false in U-Boot) */
 #define is_bad_inode(inode)	(0)
 
+/* inode_is_open_for_write - check if inode has open writers (always false) */
+#define inode_is_open_for_write(inode)	({ (void)(inode); 0; })
+
+/* inode_is_dirtytime_only - check if inode has only dirty time (always false) */
+#define inode_is_dirtytime_only(inode)	({ (void)(inode); 0; })
+
 /* Inode state bits for i_state field */
 #define I_NEW			(1 << 0)
 #define I_FREEING		(1 << 1)
@@ -323,6 +329,53 @@  enum {
 /* Maximum file size for large files */
 #define MAX_LFS_FILESIZE	((loff_t)LLONG_MAX)
 
+/*
+ * Inode operation stubs - U-Boot has simplified inode handling
+ */
+#define icount_read(inode)		(1)
+#define i_uid_write(inode, uid)		do { } while (0)
+#define i_gid_write(inode, gid)		do { } while (0)
+#define inode_fsuid_set(inode, idmap)	do { } while (0)
+#define inode_init_owner(idmap, i, dir, mode) \
+	do { (i)->i_mode = (mode); } while (0)
+#define insert_inode_locked(inode)	(0)
+#define unlock_new_inode(inode)		do { } while (0)
+#define clear_nlink(inode)		do { } while (0)
+#define set_nlink(i, n)			do { (i)->i_nlink = (n); } while (0)
+#define inc_nlink(i)			do { (i)->i_nlink++; } while (0)
+#define drop_nlink(i)			do { (i)->i_nlink--; } while (0)
+#define IS_NOQUOTA(inode)		(0)
+#define IS_SWAPFILE(inode)		({ (void)(inode); 0; })
+#define inode_set_ctime_current(i)	({ (void)(i); (struct timespec64){}; })
+#define inode_set_mtime_to_ts(i, ts)	({ (void)(i); (ts); })
+#define inode_set_flags(i, f, m)	do { } while (0)
+#define inode_set_cached_link(i, l, len) do { } while (0)
+#define init_special_inode(i, m, d)	do { } while (0)
+#define make_bad_inode(i)		do { } while (0)
+#define iget_failed(i)			do { } while (0)
+#define find_inode_by_ino_rcu(sb, ino)	((struct inode *)NULL)
+#define mark_inode_dirty(i)		do { } while (0)
+#define invalidate_inode_buffers(i)	do { } while (0)
+#define clear_inode(i)			do { } while (0)
+
+/* Inode credential helpers */
+#define i_uid_needs_update(m, a, i)	({ (void)(m); (void)(a); (void)(i); 0; })
+#define i_gid_needs_update(m, a, i)	({ (void)(m); (void)(a); (void)(i); 0; })
+#define i_uid_update(m, a, i)		do { } while (0)
+#define i_gid_update(m, a, i)		do { } while (0)
+
+/* lock_two_nondirectories - lock two inodes in order */
+#define lock_two_nondirectories(i1, i2) \
+	do { (void)(i1); (void)(i2); } while (0)
+#define unlock_two_nondirectories(i1, i2) \
+	do { (void)(i1); (void)(i2); } while (0)
+
+/* Inode allocation - implemented in ext4l/stub.c */
+struct kmem_cache;
+void *alloc_inode_sb(struct super_block *sb, struct kmem_cache *cache,
+		     gfp_t gfp);
+int inode_generic_drop(struct inode *inode);
+
 /**
  * get_block_t - block mapping callback type
  * @inode: inode to map blocks for
diff --git a/include/linux/writeback.h b/include/linux/writeback.h
index e408e3ddebb..8875b099082 100644
--- a/include/linux/writeback.h
+++ b/include/linux/writeback.h
@@ -46,4 +46,12 @@  static inline xa_mark_t wbc_to_tag(struct writeback_control *wbc)
 #define try_to_writeback_inodes_sb(sb, reason) \
 	do { (void)(sb); (void)(reason); } while (0)
 
+/**
+ * inode_io_list_del() - remove inode from I/O list
+ * @inode: inode to remove
+ *
+ * U-Boot stub - no I/O list management.
+ */
+#define inode_io_list_del(inode)	do { (void)(inode); } while (0)
+
 #endif /* WRITEBACK_H */