In order to prepare for the upcoming metadata compression.

Signed-off-by: Gao Xiang <[email protected]>
---
 include/erofs/cache.h    |  9 +++++----
 include/erofs/internal.h |  6 ------
 include/erofs/io.h       |  2 +-
 lib/cache.c              | 12 +++++++++---
 lib/io.c                 |  6 +++---
 mkfs/main.c              |  4 ++--
 6 files changed, 20 insertions(+), 19 deletions(-)

diff --git a/include/erofs/cache.h b/include/erofs/cache.h
index 0c665e8f..d5618c00 100644
--- a/include/erofs/cache.h
+++ b/include/erofs/cache.h
@@ -57,18 +57,18 @@ struct erofs_buffer_block {
 };
 
 struct erofs_bufmgr {
-       struct erofs_sb_info *sbi;
-
        /* buckets for all buffer blocks to boost up allocation */
        struct list_head watermeter[META + 1][2][EROFS_MAX_BLOCK_SIZE];
        unsigned long bktmap[META + 1][2][EROFS_MAX_BLOCK_SIZE / BITS_PER_LONG];
 
        struct erofs_buffer_block blkh;
-       erofs_blk_t tail_blkaddr, metablkcnt;
+       struct erofs_sb_info *sbi;
+       struct erofs_vfile *vf;
 
        /* last mapped buffer block to accelerate erofs_mapbh() */
        struct erofs_buffer_block *last_mapped_block;
 
+       erofs_blk_t tail_blkaddr, metablkcnt;
        /* align data block addresses to multiples of `dsunit` */
        unsigned int dsunit;
 };
@@ -122,7 +122,8 @@ static inline int erofs_bh_flush_generic_end(struct 
erofs_buffer_head *bh)
 }
 
 struct erofs_bufmgr *erofs_buffer_init(struct erofs_sb_info *sbi,
-                                      erofs_blk_t startblk);
+                                      erofs_blk_t startblk,
+                                      struct erofs_vfile *vf);
 int erofs_bh_balloon(struct erofs_buffer_head *bh, erofs_off_t incr);
 
 struct erofs_buffer_head *erofs_balloc(struct erofs_bufmgr *bmgr,
diff --git a/include/erofs/internal.h b/include/erofs/internal.h
index 65d40840..1431c16d 100644
--- a/include/erofs/internal.h
+++ b/include/erofs/internal.h
@@ -487,12 +487,6 @@ static inline int erofs_dev_write(struct erofs_sb_info 
*sbi, const void *buf,
        return 0;
 }
 
-static inline int erofs_dev_fillzero(struct erofs_sb_info *sbi, u64 offset,
-                                    size_t len, bool pad)
-{
-       return erofs_io_fallocate(&sbi->bdev, offset, len, pad);
-}
-
 static inline int erofs_dev_resize(struct erofs_sb_info *sbi,
                                   erofs_blk_t blocks)
 {
diff --git a/include/erofs/io.h b/include/erofs/io.h
index 101a5ba4..14d6e45f 100644
--- a/include/erofs/io.h
+++ b/include/erofs/io.h
@@ -59,7 +59,7 @@ ssize_t erofs_io_pwrite(struct erofs_vfile *vf, const void 
*buf, u64 pos, size_t
 ssize_t erofs_io_pwritev(struct erofs_vfile *vf, const struct iovec *iov,
                         int iovcnt, u64 pos);
 int erofs_io_fsync(struct erofs_vfile *vf);
-ssize_t erofs_io_fallocate(struct erofs_vfile *vf, u64 offset, size_t len, 
bool pad);
+int erofs_io_fallocate(struct erofs_vfile *vf, u64 offset, size_t len, bool 
pad);
 int erofs_io_ftruncate(struct erofs_vfile *vf, u64 length);
 ssize_t erofs_io_pread(struct erofs_vfile *vf, void *buf, u64 offset, size_t 
len);
 ssize_t erofs_io_read(struct erofs_vfile *vf, void *buf, size_t len);
diff --git a/lib/cache.c b/lib/cache.c
index b3cf1c48..079465ed 100644
--- a/lib/cache.c
+++ b/lib/cache.c
@@ -29,7 +29,8 @@ const struct erofs_bhops erofs_skip_write_bhops = {
 };
 
 struct erofs_bufmgr *erofs_buffer_init(struct erofs_sb_info *sbi,
-                                      erofs_blk_t startblk)
+                                      erofs_blk_t startblk,
+                                      struct erofs_vfile *vf)
 {
        unsigned int blksiz = erofs_blksiz(sbi);
        struct erofs_bufmgr *bmgr;
@@ -54,6 +55,7 @@ struct erofs_bufmgr *erofs_buffer_init(struct erofs_sb_info 
*sbi,
        bmgr->last_mapped_block = &bmgr->blkh;
        bmgr->metablkcnt = 0;
        bmgr->dsunit = 0;
+       bmgr->vf = vf ?: &sbi->bdev;
        return bmgr;
 }
 
@@ -482,9 +484,13 @@ int erofs_bflush(struct erofs_bufmgr *bmgr,
                        continue;
 
                padding = blksiz - (p->buffers.off & (blksiz - 1));
-               if (padding != blksiz)
-                       erofs_dev_fillzero(sbi, erofs_pos(sbi, blkaddr) - 
padding,
+               if (padding != blksiz) {
+                       ret = erofs_io_fallocate(bmgr->vf,
+                                          erofs_pos(sbi, blkaddr) - padding,
                                           padding, true);
+                       if (ret < 0)
+                               return ret;
+               }
 
                if (p->type != DATA)
                        bmgr->metablkcnt += p->buffers.nblocks;
diff --git a/lib/io.c b/lib/io.c
index aa043cae..983d9bf9 100644
--- a/lib/io.c
+++ b/lib/io.c
@@ -147,8 +147,8 @@ int erofs_io_fsync(struct erofs_vfile *vf)
        return 0;
 }
 
-ssize_t erofs_io_fallocate(struct erofs_vfile *vf, u64 offset,
-                          size_t len, bool zeroout)
+int erofs_io_fallocate(struct erofs_vfile *vf, u64 offset,
+                      size_t len, bool zeroout)
 {
        static const char zero[EROFS_MAX_BLOCK_SIZE] = {0};
        ssize_t ret;
@@ -167,7 +167,7 @@ ssize_t erofs_io_fallocate(struct erofs_vfile *vf, u64 
offset,
        while (len > EROFS_MAX_BLOCK_SIZE) {
                ret = erofs_io_pwrite(vf, zero, offset, EROFS_MAX_BLOCK_SIZE);
                if (ret < 0)
-                       return ret;
+                       return (int)ret;
                len -= ret;
                offset += ret;
        }
diff --git a/mkfs/main.c b/mkfs/main.c
index fce26336..30804d10 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -1377,7 +1377,7 @@ int main(int argc, char **argv)
        }
 
        if (!incremental_mode) {
-               g_sbi.bmgr = erofs_buffer_init(&g_sbi, 0);
+               g_sbi.bmgr = erofs_buffer_init(&g_sbi, 0, NULL);
                if (!g_sbi.bmgr) {
                        err = -ENOMEM;
                        goto exit;
@@ -1405,7 +1405,7 @@ int main(int argc, char **argv)
                        u.startblk = DIV_ROUND_UP(u.st.st_size, 
erofs_blksiz(&g_sbi));
                else
                        u.startblk = g_sbi.primarydevice_blocks;
-               g_sbi.bmgr = erofs_buffer_init(&g_sbi, u.startblk);
+               g_sbi.bmgr = erofs_buffer_init(&g_sbi, u.startblk, NULL);
                if (!g_sbi.bmgr) {
                        err = -ENOMEM;
                        goto exit;
-- 
2.43.5


Reply via email to