[PATCH] erofs-utils: move erofs_sb_csum_set() and erofs_mkfs_alloc_root() into lib/ for external use
Hongzhen Luo
hongzhen at linux.alibaba.com
Tue Jun 25 13:10:05 AEST 2024
Signed-off-by: Hongzhen Luo <hongzhen at linux.alibaba.com>
---
include/erofs/inode.h | 1 +
include/erofs/internal.h | 1 +
lib/inode.c | 16 +++++++++
lib/super.c | 47 ++++++++++++++++++++++++
mkfs/main.c | 77 +++++-----------------------------------
5 files changed, 73 insertions(+), 69 deletions(-)
diff --git a/include/erofs/inode.h b/include/erofs/inode.h
index 2af8e6c..604161c 100644
--- a/include/erofs/inode.h
+++ b/include/erofs/inode.h
@@ -45,6 +45,7 @@ struct erofs_inode *erofs_mkfs_build_tree_from_path(struct erofs_sb_info *sbi,
struct erofs_inode *erofs_mkfs_build_special_from_fd(struct erofs_sb_info *sbi,
int fd, const char *name);
int erofs_fixup_root_inode(struct erofs_inode *root);
+struct erofs_inode *erofs_rebuild_make_root(struct erofs_sb_info *sbi);
#ifdef __cplusplus
}
diff --git a/include/erofs/internal.h b/include/erofs/internal.h
index 8ed5b0e..361477a 100644
--- a/include/erofs/internal.h
+++ b/include/erofs/internal.h
@@ -403,6 +403,7 @@ 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(struct erofs_sb_info *sbi);
+int erofs_enable_sb_chksum(struct erofs_sb_info *sbi, u32 *crc);
/* namei.c */
int erofs_read_inode_from_disk(struct erofs_inode *vi);
diff --git a/lib/inode.c b/lib/inode.c
index 60a076a..68f16f4 100644
--- a/lib/inode.c
+++ b/lib/inode.c
@@ -1986,3 +1986,19 @@ int erofs_fixup_root_inode(struct erofs_inode *root)
free(ibuf);
return err;
}
+
+struct erofs_inode *erofs_rebuild_make_root(struct erofs_sb_info *sbi)
+{
+ struct erofs_inode *root;
+
+ root = erofs_new_inode(sbi);
+ if (IS_ERR(root))
+ return root;
+ root->i_srcpath = strdup("/");
+ root->i_mode = S_IFDIR | 0777;
+ root->i_parent = root;
+ root->i_mtime = root->sbi->build_time;
+ root->i_mtime_nsec = root->sbi->build_time_nsec;
+ erofs_init_empty_dir(root);
+ return root;
+}
diff --git a/lib/super.c b/lib/super.c
index 69c57c8..7579875 100644
--- a/lib/super.c
+++ b/lib/super.c
@@ -232,3 +232,50 @@ err_bdrop:
erofs_bdrop(bh, true);
return ERR_PTR(err);
}
+
+int erofs_enable_sb_chksum(struct erofs_sb_info *sbi, u32 *crc)
+{
+ int ret;
+ u8 buf[EROFS_MAX_BLOCK_SIZE];
+ unsigned int len;
+ struct erofs_super_block *sb;
+
+ ret = erofs_blk_read(sbi, 0, buf, 0, erofs_blknr(sbi, EROFS_SUPER_END) + 1);
+ if (ret) {
+ erofs_err("failed to read superblock to set checksum: %s",
+ erofs_strerror(ret));
+ return ret;
+ }
+
+ /*
+ * skip the first 1024 bytes, to allow for the installation
+ * of x86 boot sectors and other oddities.
+ */
+ sb = (struct erofs_super_block *)(buf + EROFS_SUPER_OFFSET);
+
+ if (le32_to_cpu(sb->magic) != EROFS_SUPER_MAGIC_V1) {
+ erofs_err("internal error: not an erofs valid image");
+ return -EFAULT;
+ }
+
+ /* turn on checksum feature */
+ sb->feature_compat = cpu_to_le32(le32_to_cpu(sb->feature_compat) |
+ EROFS_FEATURE_COMPAT_SB_CHKSUM);
+ if (erofs_blksiz(sbi) > EROFS_SUPER_OFFSET)
+ len = erofs_blksiz(sbi) - EROFS_SUPER_OFFSET;
+ else
+ len = erofs_blksiz(sbi);
+ *crc = erofs_crc32c(~0, (u8 *)sb, len);
+
+ /* set up checksum field to erofs_super_block */
+ sb->checksum = cpu_to_le32(*crc);
+
+ ret = erofs_blk_write(sbi, buf, 0, 1);
+ if (ret) {
+ erofs_err("failed to write checksummed superblock: %s",
+ erofs_strerror(ret));
+ return ret;
+ }
+
+ return 0;
+}
diff --git a/mkfs/main.c b/mkfs/main.c
index e20e8c0..28a271d 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -975,55 +975,6 @@ static int mkfs_parse_options_cfg(int argc, char *argv[])
return 0;
}
-static int erofs_mkfs_superblock_csum_set(void)
-{
- int ret;
- u8 buf[EROFS_MAX_BLOCK_SIZE];
- u32 crc;
- unsigned int len;
- struct erofs_super_block *sb;
-
- ret = erofs_blk_read(&sbi, 0, buf, 0, erofs_blknr(&sbi, EROFS_SUPER_END) + 1);
- if (ret) {
- erofs_err("failed to read superblock to set checksum: %s",
- erofs_strerror(ret));
- return ret;
- }
-
- /*
- * skip the first 1024 bytes, to allow for the installation
- * of x86 boot sectors and other oddities.
- */
- sb = (struct erofs_super_block *)(buf + EROFS_SUPER_OFFSET);
-
- if (le32_to_cpu(sb->magic) != EROFS_SUPER_MAGIC_V1) {
- erofs_err("internal error: not an erofs valid image");
- return -EFAULT;
- }
-
- /* turn on checksum feature */
- sb->feature_compat = cpu_to_le32(le32_to_cpu(sb->feature_compat) |
- EROFS_FEATURE_COMPAT_SB_CHKSUM);
- if (erofs_blksiz(&sbi) > EROFS_SUPER_OFFSET)
- len = erofs_blksiz(&sbi) - EROFS_SUPER_OFFSET;
- else
- len = erofs_blksiz(&sbi);
- crc = erofs_crc32c(~0, (u8 *)sb, len);
-
- /* set up checksum field to erofs_super_block */
- sb->checksum = cpu_to_le32(crc);
-
- ret = erofs_blk_write(&sbi, buf, 0, 1);
- if (ret) {
- erofs_err("failed to write checksummed superblock: %s",
- erofs_strerror(ret));
- return ret;
- }
-
- erofs_info("superblock checksum 0x%08x written", crc);
- return 0;
-}
-
static void erofs_mkfs_default_options(void)
{
cfg.c_showprogress = true;
@@ -1075,22 +1026,6 @@ void erofs_show_progs(int argc, char *argv[])
printf("%s %s\n", basename(argv[0]), cfg.c_version);
}
-static struct erofs_inode *erofs_mkfs_alloc_root(struct erofs_sb_info *sbi)
-{
- struct erofs_inode *root;
-
- root = erofs_new_inode(sbi);
- if (IS_ERR(root))
- return root;
- root->i_srcpath = strdup("/");
- root->i_mode = S_IFDIR | 0777;
- root->i_parent = root;
- root->i_mtime = root->sbi->build_time;
- root->i_mtime_nsec = root->sbi->build_time_nsec;
- erofs_init_empty_dir(root);
- return root;
-}
-
static int erofs_mkfs_rebuild_load_trees(struct erofs_inode *root)
{
struct erofs_sb_info *src;
@@ -1198,6 +1133,7 @@ int main(int argc, char **argv)
erofs_blk_t nblocks;
struct timeval t;
FILE *packedfile = NULL;
+ u32 crc;
erofs_init_configure();
erofs_mkfs_default_options();
@@ -1390,7 +1326,7 @@ int main(int argc, char **argv)
erofs_inode_manager_init();
if (tar_mode) {
- root = erofs_mkfs_alloc_root(&sbi);
+ root = erofs_rebuild_make_root(&sbi);
if (IS_ERR(root)) {
err = PTR_ERR(root);
goto exit;
@@ -1405,7 +1341,7 @@ int main(int argc, char **argv)
if (err < 0)
goto exit;
} else if (rebuild_mode) {
- root = erofs_mkfs_alloc_root(&sbi);
+ root = erofs_rebuild_make_root(&sbi);
if (IS_ERR(root)) {
err = PTR_ERR(root);
goto exit;
@@ -1471,8 +1407,11 @@ int main(int argc, char **argv)
err = erofs_dev_resize(&sbi, nblocks);
- if (!err && erofs_sb_has_sb_chksum(&sbi))
- err = erofs_mkfs_superblock_csum_set();
+ if (!err && erofs_sb_has_sb_chksum(&sbi)) {
+ err = erofs_enable_sb_chksum(&sbi, &crc);
+ if (!err)
+ erofs_info("superblock checksum 0x%08x written", crc);
+ }
exit:
if (root)
erofs_iput(root);
--
2.39.3
More information about the Linux-erofs
mailing list