[Concept,13/17] ext4l: Move folio operations to proper headers

Message ID 20260120234344.495605-14-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 folio-related definitions to their proper Linux headers:

- folio_batch_release() to linux/pagevec.h
- Block/buffer folio operations: bh_offset(), block_invalidate_folio(),
  block_dirty_folio(), block_read_full_folio(), etc. to linux/buffer_head.h
- Folio function declarations: __filemap_get_folio(), folio_put(),
  folio_get(), etc. to linux/pagemap.h
- Folio writeback and read stubs to linux/pagemap.h
- Writeback control stubs: wbc_init_bio(), wbc_account_cgroup_owner()
  to linux/pagemap.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       | 49 ++++++-------------------------------
 include/linux/buffer_head.h | 19 ++++++++++++++
 include/linux/pagemap.h     | 18 ++++++++++++++
 include/linux/pagevec.h     | 11 +++++++++
 4 files changed, 56 insertions(+), 41 deletions(-)
  

Patch

diff --git a/fs/ext4l/ext4_uboot.h b/fs/ext4l/ext4_uboot.h
index 49dd566262b..12250b8daf4 100644
--- a/fs/ext4l/ext4_uboot.h
+++ b/fs/ext4l/ext4_uboot.h
@@ -690,14 +690,7 @@  struct dx_hash_info {
 /* address_space_operations is in linux/fs.h */
 /* buffer_migrate_folio, buffer_migrate_folio_norefs, noop_dirty_folio are in linux/buffer_head.h */
 /* readahead_control, FGP_*, kmap/kunmap, folio stubs are in linux/pagemap.h */
-
-/* Folio operations - implemented in support.c */
-struct folio *__filemap_get_folio(struct address_space *mapping,
-				  pgoff_t index, unsigned int fgp_flags,
-				  gfp_t gfp);
-void folio_put(struct folio *folio);
-void folio_get(struct folio *folio);
-void mapping_clear_folio_cache(struct address_space *mapping);
+/* __filemap_get_folio, folio_put, folio_get, mapping_clear_folio_cache are in linux/pagemap.h */
 
 /* projid_t is now in linux/projid.h */
 
@@ -748,7 +741,7 @@  void mapping_clear_folio_cache(struct address_space *mapping);
 /* 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)
+/* folio_batch_release is in linux/pagevec.h */
 
 /* Quota stubs are in linux/quotaops.h */
 
@@ -757,20 +750,8 @@  void mapping_clear_folio_cache(struct address_space *mapping);
 /* Filemap operations are in linux/pagemap.h */
 /* try_to_writeback_inodes_sb is in linux/writeback.h */
 
-/* Buffer operations - additional */
-/* getblk_unmovable is in linux/buffer_head.h */
-#define create_empty_buffers(f, s, flags)	({ (void)(f); (void)(s); (void)(flags); (struct buffer_head *)NULL; })
-/* bh_offset returns offset of b_data within the folio */
-#define bh_offset(bh)				((bh)->b_folio ? \
-	(unsigned long)((char *)(bh)->b_data - (char *)(bh)->b_folio->data) : 0UL)
-#define block_invalidate_folio(f, o, l)		do { } while (0)
-#define block_write_end(pos, len, copied, folio) ({ (void)(pos); (void)(len); (void)(folio); (copied); })
-#define block_dirty_folio(m, f)			({ (void)(m); (void)(f); false; })
-#define try_to_free_buffers(f)			({ (void)(f); true; })
-#define block_commit_write(f, f2, t)		do { } while (0)
-#define block_page_mkwrite(v, f, g)		((vm_fault_t)0)
-#define map_bh(bh, sb, block)			do { } while (0)
-#define write_begin_get_folio(iocb, m, idx, l)	({ (void)(iocb); (void)(m); (void)(idx); (void)(l); (struct folio *)NULL; })
+/* Buffer/block folio operations are in linux/buffer_head.h */
+/* write_begin_get_folio is in linux/pagemap.h */
 
 /* fscrypt_name, fscrypt_match_name, and fscrypt stubs are in ext4_fscrypt.h */
 
@@ -1283,17 +1264,8 @@  struct buffer_head *__bread(struct block_device *bdev, sector_t block, unsigned
 
 /* fscrypt page-io stubs are in ext4_fscrypt.h */
 
-/* folio writeback operations */
-#define folio_end_writeback(f)		do { (void)(f); } while (0)
-#define folio_start_writeback(f)	do { (void)(f); } while (0)
-#define folio_start_writeback_keepwrite(f) do { (void)(f); } while (0)
-bool __folio_start_writeback(struct folio *folio, bool keep_write);
-
-/* writeback control stubs */
-#define wbc_init_bio(wbc, bio)		do { (void)(wbc); (void)(bio); } while (0)
-#define wbc_account_cgroup_owner(wbc, folio, bytes) \
-	do { (void)(wbc); (void)(folio); (void)(bytes); } while (0)
-
+/* folio writeback operations are in linux/pagemap.h */
+/* writeback control stubs are in linux/pagemap.h */
 /* bio_add_folio is in linux/bio.h */
 
 /*
@@ -1303,10 +1275,7 @@  bool __folio_start_writeback(struct folio *folio, bool keep_write);
 /* mempool is now in linux/mempool.h */
 #include <linux/mempool.h>
 
-/* folio read operations */
-#define folio_end_read(f, success)	do { (void)(f); (void)(success); } while (0)
-#define folio_set_mappedtodisk(f)	do { (void)(f); } while (0)
-
+/* folio read operations are in linux/pagemap.h */
 /* fscrypt readpage stubs are in ext4_fscrypt.h */
 
 /* fsverity stubs are in linux/fsverity.h */
@@ -1316,9 +1285,7 @@  bool __folio_start_writeback(struct folio *folio, bool keep_write);
 /* prefetch operations */
 #define prefetchw(addr)			do { (void)(addr); } while (0)
 
-/* block read operations */
-#define block_read_full_folio(folio, get_block) \
-	({ (void)(folio); (void)(get_block); 0; })
+/* block_read_full_folio is in linux/buffer_head.h */
 
 /*
  * Stubs for fast_commit.c
diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h
index 3e5893ab99d..ea317a6488d 100644
--- a/include/linux/buffer_head.h
+++ b/include/linux/buffer_head.h
@@ -268,4 +268,23 @@  static inline void end_buffer_read_sync(struct buffer_head *bh, int uptodate)
 #define __find_get_block_nonatomic(bdev, block, size) \
 	({ (void)(bdev); (void)(block); (void)(size); (struct buffer_head *)NULL; })
 
+/*
+ * Block/buffer folio operations - U-Boot stubs
+ */
+#define create_empty_buffers(f, s, flags) \
+	({ (void)(f); (void)(s); (void)(flags); (struct buffer_head *)NULL; })
+/* bh_offset returns offset of b_data within the folio */
+#define bh_offset(bh)			((bh)->b_folio ? \
+	(unsigned long)((char *)(bh)->b_data - (char *)(bh)->b_folio->data) : 0UL)
+#define block_invalidate_folio(f, o, l)	do { } while (0)
+#define block_write_end(pos, len, copied, folio) \
+	({ (void)(pos); (void)(len); (void)(folio); (copied); })
+#define block_dirty_folio(m, f)		({ (void)(m); (void)(f); false; })
+#define try_to_free_buffers(f)		({ (void)(f); true; })
+#define block_commit_write(f, f2, t)	do { } while (0)
+#define block_page_mkwrite(v, f, g)	((vm_fault_t)0)
+#define map_bh(bh, sb, block)		do { } while (0)
+#define block_read_full_folio(folio, get_block) \
+	({ (void)(folio); (void)(get_block); 0; })
+
 #endif /* _LINUX_BUFFER_HEAD_H */
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index 19a64993955..eb689fa885f 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -94,11 +94,29 @@  struct folio {
 #define folio_end_writeback(f)		do { (void)(f); } while (0)
 #define folio_start_writeback(f)	do { (void)(f); } while (0)
 #define folio_start_writeback_keepwrite(f) do { (void)(f); } while (0)
+bool __folio_start_writeback(struct folio *folio, bool keep_write);
 #define folio_end_read(f, success)	do { (void)(f); (void)(success); } while (0)
 #define folio_set_mappedtodisk(f)	do { (void)(f); } while (0)
 #define folio_redirty_for_writepage(wbc, folio) \
 	({ (void)(wbc); (void)(folio); false; })
 
+/* Folio operations - implemented in ext4l/support.c */
+struct folio *__filemap_get_folio(struct address_space *mapping,
+				  pgoff_t index, unsigned int fgp_flags,
+				  gfp_t gfp);
+void folio_put(struct folio *folio);
+void folio_get(struct folio *folio);
+void mapping_clear_folio_cache(struct address_space *mapping);
+
+/* Writeback control stubs */
+#define wbc_init_bio(wbc, bio)		do { (void)(wbc); (void)(bio); } while (0)
+#define wbc_account_cgroup_owner(wbc, folio, bytes) \
+	do { (void)(wbc); (void)(folio); (void)(bytes); } while (0)
+
+/* Write begin helper */
+#define write_begin_get_folio(iocb, m, idx, l) \
+	({ (void)(iocb); (void)(m); (void)(idx); (void)(l); (struct folio *)NULL; })
+
 /*
  * offset_in_folio - calculate offset of pointer within folio's data
  *
diff --git a/include/linux/pagevec.h b/include/linux/pagevec.h
index b794ff8f47c..b83a8420b3d 100644
--- a/include/linux/pagevec.h
+++ b/include/linux/pagevec.h
@@ -43,4 +43,15 @@  static inline unsigned int folio_batch_add(struct folio_batch *fbatch,
 	return PAGEVEC_SIZE - fbatch->nr;
 }
 
+/**
+ * folio_batch_release() - release a batch of folios
+ * @fbatch: batch to release
+ *
+ * U-Boot stub - no-op.
+ */
+static inline void folio_batch_release(struct folio_batch *fbatch)
+{
+	(void)fbatch;
+}
+
 #endif /* _LINUX_PAGEVEC_H */