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