Refactor `erofs_buffer_init()` to wrap up necessary operations for full
builds.

Introduce another `erofs_buffer_init()` to specify start block address
for the upcoming incremental builds.

Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com>
---
 include/erofs/cache.h    |  2 +-
 include/erofs/internal.h |  1 +
 lib/cache.c              | 11 ++---------
 lib/super.c              | 31 +++++++++++++++++++++++++++++++
 mkfs/main.c              | 17 +----------------
 5 files changed, 36 insertions(+), 26 deletions(-)

diff --git a/include/erofs/cache.h b/include/erofs/cache.h
index 350cec6..f30fe9f 100644
--- a/include/erofs/cache.h
+++ b/include/erofs/cache.h
@@ -98,7 +98,7 @@ static inline int erofs_bh_flush_generic_end(struct 
erofs_buffer_head *bh)
        return 0;
 }
 
-struct erofs_buffer_head *erofs_buffer_init(void);
+void erofs_buffer_init(erofs_blk_t startblk);
 int erofs_bh_balloon(struct erofs_buffer_head *bh, erofs_off_t incr);
 
 struct erofs_buffer_head *erofs_balloc(int type, erofs_off_t size,
diff --git a/include/erofs/internal.h b/include/erofs/internal.h
index 277295e..f8a01ce 100644
--- a/include/erofs/internal.h
+++ b/include/erofs/internal.h
@@ -397,6 +397,7 @@ int erofs_read_superblock(struct erofs_sb_info *sbi);
 void erofs_put_super(struct erofs_sb_info *sbi);
 int erofs_writesb(struct erofs_sb_info *sbi, struct erofs_buffer_head *sb_bh,
                  erofs_blk_t *blocks);
+struct erofs_buffer_head *erofs_reserve_sb(void);
 
 /* namei.c */
 int erofs_read_inode_from_disk(struct erofs_inode *vi);
diff --git a/lib/cache.c b/lib/cache.c
index 664e598..328ca4a 100644
--- a/lib/cache.c
+++ b/lib/cache.c
@@ -38,21 +38,14 @@ const struct erofs_bhops erofs_skip_write_bhops = {
        .flush = erofs_bh_flush_skip_write,
 };
 
-/* return buffer_head of erofs super block (with size 0) */
-struct erofs_buffer_head *erofs_buffer_init(void)
+void erofs_buffer_init(erofs_blk_t startblk)
 {
        int i, j;
-       struct erofs_buffer_head *bh = erofs_balloc(META, 0, 0, 0);
-
-       if (IS_ERR(bh))
-               return bh;
-
-       bh->op = &erofs_skip_write_bhops;
 
        for (i = 0; i < ARRAY_SIZE(mapped_buckets); i++)
                for (j = 0; j < ARRAY_SIZE(mapped_buckets[0]); j++)
                        init_list_head(&mapped_buckets[i][j]);
-       return bh;
+       tail_blkaddr = startblk;
 }
 
 static void erofs_bupdate_mapped(struct erofs_buffer_block *bb)
diff --git a/lib/super.c b/lib/super.c
index 33e908a..c8c33b6 100644
--- a/lib/super.c
+++ b/lib/super.c
@@ -201,3 +201,34 @@ int erofs_writesb(struct erofs_sb_info *sbi, struct 
erofs_buffer_head *sb_bh,
                erofs_bdrop(sb_bh, false);
        return ret;
 }
+
+struct erofs_buffer_head *erofs_reserve_sb(void)
+{
+       struct erofs_buffer_head *bh;
+       int err;
+
+       erofs_buffer_init(0);
+       bh = erofs_balloc(META, 0, 0, 0);
+       if (IS_ERR(bh)) {
+               erofs_err("failed to allocate super: %s", PTR_ERR(bh));
+               return bh;
+       }
+       bh->op = &erofs_skip_write_bhops;
+       err = erofs_bh_balloon(bh, EROFS_SUPER_END);
+       if (err < 0) {
+               erofs_err("failed to balloon super: %s", erofs_strerror(err));
+               goto err_bdrop;
+       }
+
+       /* make sure that the super block should be the very first blocks */
+       (void)erofs_mapbh(bh->block);
+       if (erofs_btell(bh, false) != 0) {
+               erofs_err("failed to pin super block @ 0");
+               err = -EFAULT;
+               goto err_bdrop;
+       }
+       return bh;
+err_bdrop:
+       erofs_bdrop(bh, true);
+       return ERR_PTR(err);
+}
diff --git a/mkfs/main.c b/mkfs/main.c
index 6577267..1e8ca3c 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -1244,24 +1244,9 @@ int main(int argc, char **argv)
                sbi.blkszbits = src->blkszbits;
        }
 
-       sb_bh = erofs_buffer_init();
+       sb_bh = erofs_reserve_sb();
        if (IS_ERR(sb_bh)) {
                err = PTR_ERR(sb_bh);
-               erofs_err("failed to initialize buffers: %s",
-                         erofs_strerror(err));
-               goto exit;
-       }
-       err = erofs_bh_balloon(sb_bh, EROFS_SUPER_END);
-       if (err < 0) {
-               erofs_err("failed to balloon erofs_super_block: %s",
-                         erofs_strerror(err));
-               goto exit;
-       }
-
-       /* make sure that the super block should be the very first blocks */
-       (void)erofs_mapbh(sb_bh->block);
-       if (erofs_btell(sb_bh, false) != 0) {
-               erofs_err("failed to reserve erofs_super_block");
                goto exit;
        }
 
-- 
2.39.3

Reply via email to