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 and get rid of PAGE_SIZE. Cc: Kelvin Zhang <zhangkel...@google.com> Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com> --- change since v1: - get rid of PAGE_SIZE (Kelvin); configure.ac | 38 ++++++++++++++++++++++++++++++++++++++ include/erofs/internal.h | 10 ++-------- lib/namei.c | 2 +- mkfs/main.c | 4 ++-- 4 files changed, 43 insertions(+), 11 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..370cfac 100644 --- a/include/erofs/internal.h +++ b/include/erofs/internal.h @@ -27,16 +27,10 @@ typedef unsigned short umode_t; #define PATH_MAX 4096 /* # chars in a path name including nul */ #endif -#ifndef PAGE_SHIFT -#define PAGE_SHIFT (12) +#ifndef EROFS_MAX_BLOCK_SIZE +#define EROFS_MAX_BLOCK_SIZE 4096 #endif -#ifndef PAGE_SIZE -#define PAGE_SIZE (1U << PAGE_SHIFT) -#endif - -#define EROFS_MAX_BLOCK_SIZE PAGE_SIZE - #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