[PATCH] erofs-utils: support detecting maximum block size
Gao Xiang
hsiangkao at linux.alibaba.com
Thu Jun 1 16:46:47 AEST 2023
Previously PAGE_SIZE was actually unset for most cases so that it was
always hard-coded 4096.
In order to set EROFS_MAX_BLOCK_SIZE correctly, let's detect the real
page size when configuring.
Cc: Kelvin Zhang <zhangkelvin at google.com>
Signed-off-by: Gao Xiang <hsiangkao at linux.alibaba.com>
---
configure.ac | 38 ++++++++++++++++++++++++++++++++++++++
include/erofs/internal.h | 8 +++-----
lib/namei.c | 2 +-
mkfs/main.c | 4 ++--
4 files changed, 44 insertions(+), 8 deletions(-)
diff --git a/configure.ac b/configure.ac
index 4dbe86f..2ade490 100644
--- a/configure.ac
+++ b/configure.ac
@@ -59,6 +59,8 @@ AC_DEFUN([EROFS_UTILS_PARSE_DIRECTORY],
fi
])
+AC_ARG_VAR([MAX_BLOCK_SIZE], [The maximum block size which erofs-utils supports])
+
AC_ARG_ENABLE([debug],
[AS_HELP_STRING([--enable-debug],
[enable debugging mode @<:@default=no@:>@])],
@@ -202,6 +204,35 @@ AC_CHECK_FUNCS(m4_flatten([
tmpfile64
utimensat]))
+# Detect maximum block size if necessary
+AS_IF([test "x$MAX_BLOCK_SIZE" = "x"], [
+ AC_CACHE_CHECK([sysconf (_SC_PAGESIZE)], [erofs_cv_max_block_size],
+ AC_RUN_IFELSE([AC_LANG_PROGRAM(
+[[
+#include <unistd.h>
+#include <stdio.h>
+]],
+[[
+ int result;
+ FILE *f;
+
+ result = sysconf(_SC_PAGESIZE);
+ if (result < 0)
+ return 1;
+
+ f = fopen("conftest.out", "w");
+ if (!f)
+ return 1;
+
+ fprintf(f, "%d", result);
+ fclose(f);
+ return 0;
+]])],
+ [erofs_cv_max_block_size=`cat conftest.out`],
+ [],
+ []))
+], [erofs_cv_max_block_size=$MAX_BLOCK_SIZE])
+
# Configure debug mode
AS_IF([test "x$enable_debug" != "xno"], [], [
dnl Turn off all assert checking.
@@ -367,6 +398,13 @@ if test "x${have_liblzma}" = "xyes"; then
AC_SUBST([liblzma_CFLAGS])
fi
+# Dump maximum block size
+AS_IF([test "x$erofs_cv_max_block_size" = "x"],
+ [$erofs_cv_max_block_size = 4096], [])
+
+AC_DEFINE_UNQUOTED([EROFS_MAX_BLOCK_SIZE], [$erofs_cv_max_block_size],
+ [The maximum block size which erofs-utils supports])
+
AC_CONFIG_FILES([Makefile
man/Makefile
lib/Makefile
diff --git a/include/erofs/internal.h b/include/erofs/internal.h
index b3d04be..ee301e0 100644
--- a/include/erofs/internal.h
+++ b/include/erofs/internal.h
@@ -27,15 +27,13 @@ typedef unsigned short umode_t;
#define PATH_MAX 4096 /* # chars in a path name including nul */
#endif
-#ifndef PAGE_SHIFT
-#define PAGE_SHIFT (12)
-#endif
-
#ifndef PAGE_SIZE
-#define PAGE_SIZE (1U << PAGE_SHIFT)
+#define PAGE_SIZE 4096
#endif
+#ifndef EROFS_MAX_BLOCK_SIZE
#define EROFS_MAX_BLOCK_SIZE PAGE_SIZE
+#endif
#define EROFS_ISLOTBITS 5
#define EROFS_SLOTSIZE (1U << EROFS_ISLOTBITS)
diff --git a/lib/namei.c b/lib/namei.c
index 3d0cf93..3751741 100644
--- a/lib/namei.c
+++ b/lib/namei.c
@@ -137,7 +137,7 @@ 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)) {
- if (erofs_blksiz() != PAGE_SIZE)
+ if (erofs_blksiz() != EROFS_MAX_BLOCK_SIZE)
return -EOPNOTSUPP;
return z_erofs_fill_inode(vi);
}
diff --git a/mkfs/main.c b/mkfs/main.c
index 3ec4903..a6a2d0e 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -532,7 +532,7 @@ 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) {
+ if (cfg.c_compr_alg[0] && erofs_blksiz() != EROFS_MAX_BLOCK_SIZE) {
erofs_err("compression is unsupported for now with block size %u",
erofs_blksiz());
return -EINVAL;
@@ -670,7 +670,7 @@ static void erofs_mkfs_default_options(void)
{
cfg.c_showprogress = true;
cfg.c_legacy_compress = false;
- sbi.blkszbits = ilog2(PAGE_SIZE);
+ sbi.blkszbits = ilog2(EROFS_MAX_BLOCK_SIZE);
sbi.feature_incompat = EROFS_FEATURE_INCOMPAT_LZ4_0PADDING;
sbi.feature_compat = EROFS_FEATURE_COMPAT_SB_CHKSUM |
EROFS_FEATURE_COMPAT_MTIME;
--
2.24.4
More information about the Linux-erofs
mailing list