aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGao Xiang <hsiangkao@linux.alibaba.com>2023-03-14 14:21:21 +0800
committerGao Xiang <hsiangkao@linux.alibaba.com>2023-03-15 16:29:12 +0800
commita4fb8ea13ac734a2f6b2bc12c0e3f1e20912fa0c (patch)
tree5055cb7a2c0d643606093ef86bb6da584a87f3c0
parent7bc02f16e1021ec8142286a9e609b82beb2a6d31 (diff)
downloaderofs-utils-a4fb8ea13ac734a2f6b2bc12c0e3f1e20912fa0c.tar.gz
erofs-utils: support arbitrary block sizes
- Add a new command option for mkfs.erofs; - fuse/dump/fsck supports arbitrary block sizes (uncompressed files). Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com> Link: https://lore.kernel.org/r/20230314062121.115020-4-hsiangkao@linux.alibaba.com
-rw-r--r--lib/namei.c5
-rw-r--r--lib/super.c6
-rw-r--r--mkfs/main.c27
3 files changed, 30 insertions, 8 deletions
diff --git a/lib/namei.c b/lib/namei.c
index 6ee4925..3d0cf93 100644
--- a/lib/namei.c
+++ b/lib/namei.c
@@ -136,8 +136,11 @@ int erofs_read_inode_from_disk(struct erofs_inode *vi)
}
vi->u.chunkbits = sbi.blkszbits +
(vi->u.chunkformat & EROFS_CHUNK_FORMAT_BLKBITS_MASK);
- } else if (erofs_inode_is_data_compressed(vi->datalayout))
+ } else if (erofs_inode_is_data_compressed(vi->datalayout)) {
+ if (erofs_blksiz() != PAGE_SIZE)
+ return -EOPNOTSUPP;
return z_erofs_fill_inode(vi);
+ }
return 0;
bogusimode:
erofs_err("bogus i_mode (%o) @ nid %llu", vi->i_mode, vi->nid | 0ULL);
diff --git a/lib/super.c b/lib/super.c
index ff19493..17f849e 100644
--- a/lib/super.c
+++ b/lib/super.c
@@ -68,11 +68,11 @@ static int erofs_init_devices(struct erofs_sb_info *sbi,
int erofs_read_superblock(void)
{
- char data[EROFS_MAX_BLOCK_SIZE];
+ u8 data[EROFS_MAX_BLOCK_SIZE];
struct erofs_super_block *dsb;
int ret;
- ret = blk_read(0, data, 0, 1);
+ ret = blk_read(0, data, 0, erofs_blknr(sizeof(data)));
if (ret < 0) {
erofs_err("cannot read erofs superblock: %d", ret);
return -EIO;
@@ -89,7 +89,7 @@ int erofs_read_superblock(void)
sbi.blkszbits = dsb->blkszbits;
/* 9(512 bytes) + LOG_SECTORS_PER_BLOCK == LOG_BLOCK_SIZE */
- if (1u << sbi.blkszbits != PAGE_SIZE) {
+ if (sbi.blkszbits < 9) {
erofs_err("blksize %d isn't supported on this platform",
erofs_blksiz());
return ret;
diff --git a/mkfs/main.c b/mkfs/main.c
index b4e4c8d..f4d2330 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -82,6 +82,7 @@ static void usage(void)
{
fputs("usage: [options] FILE DIRECTORY\n\n"
"Generate erofs image from DIRECTORY to FILE, and [options] are:\n"
+ " -b# set block size to # (# = page size by default)\n"
" -d# set output message level to # (maximum 9)\n"
" -x# set xattr tolerance to # (< 0, disable xattrs; default 2)\n"
" -zX[,Y][:..] X=compressor (Y=compression level, optional)\n"
@@ -273,7 +274,7 @@ static int mkfs_parse_options_cfg(int argc, char *argv[])
int opt, i;
bool quiet = false;
- while ((opt = getopt_long(argc, argv, "C:E:L:T:U:d:x:z:",
+ while ((opt = getopt_long(argc, argv, "C:E:L:T:U:b:d:x:z:",
long_options, NULL)) != -1) {
switch (opt) {
case 'z':
@@ -287,6 +288,15 @@ static int mkfs_parse_options_cfg(int argc, char *argv[])
return i;
break;
+ case 'b':
+ i = atoi(optarg);
+ if (i < 512 || i > EROFS_MAX_BLOCK_SIZE) {
+ erofs_err("invalid block size %s", optarg);
+ return -EINVAL;
+ }
+ sbi.blkszbits = ilog2(i);
+ break;
+
case 'd':
i = atoi(optarg);
if (i < EROFS_MSG_MIN || i > EROFS_MSG_MAX) {
@@ -515,7 +525,11 @@ static int mkfs_parse_options_cfg(int argc, char *argv[])
cfg.c_dbg_lvl = EROFS_ERR;
cfg.c_showprogress = false;
}
-
+ if (cfg.c_compr_alg[0] && erofs_blksiz() != PAGE_SIZE) {
+ erofs_err("compression is unsupported for now with block size %u",
+ erofs_blksiz());
+ return -EINVAL;
+ }
if (pclustersize_max) {
if (pclustersize_max < erofs_blksiz() ||
pclustersize_max % erofs_blksiz()) {
@@ -597,9 +611,10 @@ 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 = blk_read(0, buf, 0, 1);
+ ret = blk_read(0, buf, 0, erofs_blknr(sizeof(buf)));
if (ret) {
erofs_err("failed to read superblock to set checksum: %s",
erofs_strerror(ret));
@@ -620,7 +635,11 @@ static int erofs_mkfs_superblock_csum_set(void)
/* turn on checksum feature */
sb->feature_compat = cpu_to_le32(le32_to_cpu(sb->feature_compat) |
EROFS_FEATURE_COMPAT_SB_CHKSUM);
- crc = erofs_crc32c(~0, (u8 *)sb, erofs_blksiz() - EROFS_SUPER_OFFSET);
+ if (erofs_blksiz() > EROFS_SUPER_OFFSET)
+ len = erofs_blksiz() - EROFS_SUPER_OFFSET;
+ else
+ len = erofs_blksiz();
+ crc = erofs_crc32c(~0, (u8 *)sb, len);
/* set up checksum field to erofs_super_block */
sb->checksum = cpu_to_le32(crc);