[PATCH v2] erofs-utils: support detecting maximum block size
Kelvin Zhang
zhangkelvin at google.com
Fri Jun 2 00:55:57 AEST 2023
Looks good to me, please merge this patch
On Thu, Jun 1, 2023 at 10:54 AM Gao Xiang <hsiangkao at linux.alibaba.com>
wrote:
> 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 <zhangkelvin at google.com>
> Signed-off-by: Gao Xiang <hsiangkao at 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
>
>
--
Sincerely,
Kelvin Zhang
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ozlabs.org/pipermail/linux-erofs/attachments/20230601/e64ad7a1/attachment.htm>
More information about the Linux-erofs
mailing list