[PATCH 05/11] erofs-utils: lib: introduce meta buffer operations

Gao Xiang hsiangkao at linux.alibaba.com
Fri Jul 18 16:54:13 AEST 2025


Source kernel commit: fdf80a4793021c2f27953b3075f401a497519ba4
Source kernel commit: 469ad583c1293f5d9f45183050b3beeb4a8c3475
Source kernel commit: e09815446d6944fc5590a6e5f15dd51697202441

Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
 include/erofs/internal.h | 14 ++++++++++++++
 lib/data.c               | 36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+)

diff --git a/include/erofs/internal.h b/include/erofs/internal.h
index 1431c16d..b61fe716 100644
--- a/include/erofs/internal.h
+++ b/include/erofs/internal.h
@@ -46,6 +46,14 @@ typedef u64 erofs_blk_t;
 /* global sbi */
 extern struct erofs_sb_info g_sbi;
 
+struct erofs_buf {
+	struct erofs_sb_info *sbi;
+	struct erofs_vfile *vf;
+	erofs_blk_t blocknr;
+	u8 base[EROFS_MAX_BLOCK_SIZE];
+};
+#define __EROFS_BUF_INITIALIZER ((struct erofs_buf){.blocknr = ~0ULL})
+
 #define erofs_blksiz(sbi)	(1u << (sbi)->blkszbits)
 #define erofs_blknr(sbi, pos)	((pos) >> (sbi)->blkszbits)
 #define erofs_blkoff(sbi, pos)	((pos) & (erofs_blksiz(sbi) - 1))
@@ -427,6 +435,12 @@ int erofs_read_inode_from_disk(struct erofs_inode *vi);
 int erofs_ilookup(const char *path, struct erofs_inode *vi);
 
 /* data.c */
+static inline void erofs_unmap_metabuf(struct erofs_buf *buf) {}
+static inline void erofs_put_metabuf(struct erofs_buf *buf) {}
+void *erofs_bread(struct erofs_buf *buf, erofs_off_t offset, bool need_kmap);
+void erofs_init_metabuf(struct erofs_buf *buf, struct erofs_sb_info *sbi);
+void *erofs_read_metabuf(struct erofs_buf *buf, struct erofs_sb_info *sbi,
+			 erofs_off_t offset);
 int erofs_pread(struct erofs_inode *inode, char *buf,
 		erofs_off_t count, erofs_off_t offset);
 int erofs_map_blocks(struct erofs_inode *inode,
diff --git a/lib/data.c b/lib/data.c
index e2d9b5eb..d2558254 100644
--- a/lib/data.c
+++ b/lib/data.c
@@ -10,6 +10,42 @@
 #include "erofs/decompress.h"
 #include "erofs/fragments.h"
 
+void *erofs_bread(struct erofs_buf *buf, erofs_off_t offset, bool need_kmap)
+{
+	struct erofs_sb_info *sbi = buf->sbi;
+	u32 blksiz = erofs_blksiz(sbi);
+	erofs_blk_t blknr;
+	int err;
+
+	if (!need_kmap)
+		return NULL;
+	blknr = erofs_blknr(sbi, offset);
+	if (blknr != buf->blocknr) {
+		buf->blocknr = ~0ULL;
+		err = erofs_io_pread(buf->vf, buf->base, blksiz,
+				     round_down(offset, blksiz));
+		if (err < 0)
+			return ERR_PTR(err);
+		if (err != blksiz)
+			return ERR_PTR(-EIO);
+		buf->blocknr = blknr;
+	}
+	return buf->base + erofs_blkoff(sbi, offset);
+}
+
+void erofs_init_metabuf(struct erofs_buf *buf, struct erofs_sb_info *sbi)
+{
+	buf->sbi = sbi;
+	buf->vf = &sbi->bdev;
+}
+
+void *erofs_read_metabuf(struct erofs_buf *buf, struct erofs_sb_info *sbi,
+			 erofs_off_t offset)
+{
+	erofs_init_metabuf(buf, sbi);
+	return erofs_bread(buf, offset, true);
+}
+
 int __erofs_map_blocks(struct erofs_inode *inode,
 		       struct erofs_map_blocks *map, int flags)
 {
-- 
2.43.5



More information about the Linux-erofs mailing list