So that external programs can directly use it.

Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com>
---
 include/erofs/internal.h |  4 +++
 lib/super.c              | 52 ++++++++++++++++++++++++++++++++
 mkfs/main.c              | 64 +++-------------------------------------
 3 files changed, 60 insertions(+), 60 deletions(-)

diff --git a/include/erofs/internal.h b/include/erofs/internal.h
index d93bfab..f1d85be 100644
--- a/include/erofs/internal.h
+++ b/include/erofs/internal.h
@@ -134,6 +134,8 @@ struct erofs_sb_info {
        bool useqpl;
 };
 
+#define EROFS_SUPER_END (EROFS_SUPER_OFFSET + sizeof(struct erofs_super_block))
+
 /* make sure that any user of the erofs headers has atleast 64bit off_t type */
 extern int erofs_assert_largefile[sizeof(off_t)-8];
 
@@ -393,6 +395,8 @@ struct erofs_map_dev {
 /* super.c */
 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);
 
 /* namei.c */
 int erofs_read_inode_from_disk(struct erofs_inode *vi);
diff --git a/lib/super.c b/lib/super.c
index 6de5e49..33e908a 100644
--- a/lib/super.c
+++ b/lib/super.c
@@ -6,6 +6,7 @@
 #include <stdlib.h>
 #include "erofs/print.h"
 #include "erofs/xattr.h"
+#include "erofs/cache.h"
 
 static bool check_layout_compatibility(struct erofs_sb_info *sbi,
                                       struct erofs_super_block *dsb)
@@ -149,3 +150,54 @@ void erofs_put_super(struct erofs_sb_info *sbi)
        }
        erofs_xattr_prefixes_cleanup(sbi);
 }
+
+int erofs_writesb(struct erofs_sb_info *sbi, struct erofs_buffer_head *sb_bh,
+                 erofs_blk_t *blocks)
+{
+       struct erofs_super_block sb = {
+               .magic     = cpu_to_le32(EROFS_SUPER_MAGIC_V1),
+               .blkszbits = sbi->blkszbits,
+               .root_nid  = cpu_to_le16(sbi->root_nid),
+               .inos      = cpu_to_le64(sbi->inos),
+               .build_time = cpu_to_le64(sbi->build_time),
+               .build_time_nsec = cpu_to_le32(sbi->build_time_nsec),
+               .meta_blkaddr  = cpu_to_le32(sbi->meta_blkaddr),
+               .xattr_blkaddr = cpu_to_le32(sbi->xattr_blkaddr),
+               .xattr_prefix_count = sbi->xattr_prefix_count,
+               .xattr_prefix_start = cpu_to_le32(sbi->xattr_prefix_start),
+               .feature_incompat = cpu_to_le32(sbi->feature_incompat),
+               .feature_compat = cpu_to_le32(sbi->feature_compat &
+                                             ~EROFS_FEATURE_COMPAT_SB_CHKSUM),
+               .extra_devices = cpu_to_le16(sbi->extra_devices),
+               .devt_slotoff = cpu_to_le16(sbi->devt_slotoff),
+               .packed_nid = cpu_to_le64(sbi->packed_nid),
+       };
+       const u32 sb_blksize = round_up(EROFS_SUPER_END, erofs_blksiz(sbi));
+       char *buf;
+       int ret;
+
+       *blocks         = erofs_mapbh(NULL);
+       sb.blocks       = cpu_to_le32(*blocks);
+       memcpy(sb.uuid, sbi->uuid, sizeof(sb.uuid));
+       memcpy(sb.volume_name, sbi->volume_name, sizeof(sb.volume_name));
+
+       if (erofs_sb_has_compr_cfgs(sbi))
+               sb.u1.available_compr_algs = 
cpu_to_le16(sbi->available_compr_algs);
+       else
+               sb.u1.lz4_max_distance = cpu_to_le16(sbi->lz4_max_distance);
+
+       buf = calloc(sb_blksize, 1);
+       if (!buf) {
+               erofs_err("failed to allocate memory for sb: %s",
+                         erofs_strerror(-errno));
+               return -ENOMEM;
+       }
+       memcpy(buf + EROFS_SUPER_OFFSET, &sb, sizeof(sb));
+
+       ret = erofs_dev_write(sbi, buf, sb_bh ? erofs_btell(sb_bh, false) : 0,
+                             EROFS_SUPER_END);
+       free(buf);
+       if (sb_bh)
+               erofs_bdrop(sb_bh, false);
+       return ret;
+}
diff --git a/mkfs/main.c b/mkfs/main.c
index 007bea8..6577267 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -32,8 +32,6 @@
 #include "../lib/liberofs_uuid.h"
 #include "../lib/compressor.h"
 
-#define EROFS_SUPER_END (EROFS_SUPER_OFFSET + sizeof(struct erofs_super_block))
-
 static struct option long_options[] = {
        {"version", no_argument, 0, 'V'},
        {"help", no_argument, 0, 'h'},
@@ -935,58 +933,6 @@ static int mkfs_parse_options_cfg(int argc, char *argv[])
        return 0;
 }
 
-int erofs_mkfs_update_super_block(struct erofs_buffer_head *bh,
-                                 erofs_nid_t root_nid,
-                                 erofs_blk_t *blocks,
-                                 erofs_nid_t packed_nid)
-{
-       struct erofs_super_block sb = {
-               .magic     = cpu_to_le32(EROFS_SUPER_MAGIC_V1),
-               .blkszbits = sbi.blkszbits,
-               .inos   = cpu_to_le64(sbi.inos),
-               .build_time = cpu_to_le64(sbi.build_time),
-               .build_time_nsec = cpu_to_le32(sbi.build_time_nsec),
-               .blocks = 0,
-               .meta_blkaddr  = cpu_to_le32(sbi.meta_blkaddr),
-               .xattr_blkaddr = cpu_to_le32(sbi.xattr_blkaddr),
-               .xattr_prefix_count = sbi.xattr_prefix_count,
-               .xattr_prefix_start = cpu_to_le32(sbi.xattr_prefix_start),
-               .feature_incompat = cpu_to_le32(sbi.feature_incompat),
-               .feature_compat = cpu_to_le32(sbi.feature_compat &
-                                             ~EROFS_FEATURE_COMPAT_SB_CHKSUM),
-               .extra_devices = cpu_to_le16(sbi.extra_devices),
-               .devt_slotoff = cpu_to_le16(sbi.devt_slotoff),
-       };
-       const u32 sb_blksize = round_up(EROFS_SUPER_END, erofs_blksiz(&sbi));
-       char *buf;
-       int ret;
-
-       *blocks         = erofs_mapbh(NULL);
-       sb.blocks       = cpu_to_le32(*blocks);
-       sb.root_nid     = cpu_to_le16(root_nid);
-       sb.packed_nid    = cpu_to_le64(packed_nid);
-       memcpy(sb.uuid, sbi.uuid, sizeof(sb.uuid));
-       memcpy(sb.volume_name, sbi.volume_name, sizeof(sb.volume_name));
-
-       if (erofs_sb_has_compr_cfgs(&sbi))
-               sb.u1.available_compr_algs = 
cpu_to_le16(sbi.available_compr_algs);
-       else
-               sb.u1.lz4_max_distance = cpu_to_le16(sbi.lz4_max_distance);
-
-       buf = calloc(sb_blksize, 1);
-       if (!buf) {
-               erofs_err("failed to allocate memory for sb: %s",
-                         erofs_strerror(-errno));
-               return -ENOMEM;
-       }
-       memcpy(buf + EROFS_SUPER_OFFSET, &sb, sizeof(sb));
-
-       ret = erofs_dev_write(&sbi, buf, erofs_btell(bh, false), 
EROFS_SUPER_END);
-       free(buf);
-       erofs_bdrop(bh, false);
-       return ret;
-}
-
 static int erofs_mkfs_superblock_csum_set(void)
 {
        int ret;
@@ -1190,7 +1136,6 @@ int main(int argc, char **argv)
        int err = 0;
        struct erofs_buffer_head *sb_bh;
        struct erofs_inode *root_inode, *packed_inode;
-       erofs_nid_t root_nid, packed_nid;
        erofs_blk_t nblocks;
        struct timeval t;
        FILE *packedfile = NULL;
@@ -1411,7 +1356,7 @@ int main(int argc, char **argv)
                        goto exit;
                }
        }
-       root_nid = erofs_lookupnid(root_inode);
+       sbi.root_nid = erofs_lookupnid(root_inode);
        erofs_iput(root_inode);
 
        if (erofstar.index_mode && sbi.extra_devices && !erofstar.mapfile)
@@ -1423,7 +1368,7 @@ int main(int argc, char **argv)
                        goto exit;
        }
 
-       packed_nid = 0;
+       sbi.packed_nid = 0;
        if ((cfg.c_fragments || cfg.c_extra_ea_name_prefixes) &&
            erofs_sb_has_fragments(&sbi)) {
                erofs_update_progressinfo("Handling packed_file ...");
@@ -1432,7 +1377,7 @@ int main(int argc, char **argv)
                        err = PTR_ERR(packed_inode);
                        goto exit;
                }
-               packed_nid = erofs_lookupnid(packed_inode);
+               sbi.packed_nid = erofs_lookupnid(packed_inode);
                erofs_iput(packed_inode);
        }
 
@@ -1441,8 +1386,7 @@ int main(int argc, char **argv)
        if (err)
                goto exit;
 
-       err = erofs_mkfs_update_super_block(sb_bh, root_nid, &nblocks,
-                                           packed_nid);
+       err = erofs_writesb(&sbi, sb_bh, &nblocks);
        if (err)
                goto exit;
 
-- 
2.39.3

Reply via email to