From b08dcaef59c88caad54b8316c030b28f43431425 Mon Sep 17 00:00:00 2001 From: Zhiqiang Liu Date: Wed, 2 Mar 2022 14:52:57 +0800 Subject: [PATCH] mkfs.xfs: fix ASSERT on to-small device with stripe geometry. Fix issue: https://gitee.com/src-openeuler/xfsprogs/issues/I4RZKQ Signed-off-by: Zhiqiang Liu (cherry picked from commit 0f26f473cfe8bf6794745e9c8391a1384ed476e2) --- ...ERT-on-too-small-device-with-stripe-.patch | 79 +++++++++++++++++++ xfsprogs.spec | 8 +- 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 0001-mkfs.xfs-fix-ASSERT-on-too-small-device-with-stripe-.patch diff --git a/0001-mkfs.xfs-fix-ASSERT-on-too-small-device-with-stripe-.patch b/0001-mkfs.xfs-fix-ASSERT-on-too-small-device-with-stripe-.patch new file mode 100644 index 0000000..402cd5c --- /dev/null +++ b/0001-mkfs.xfs-fix-ASSERT-on-too-small-device-with-stripe-.patch @@ -0,0 +1,79 @@ +From 97a4059660b27a9b0e3d8cdde5dbef8712685865 Mon Sep 17 00:00:00 2001 +From: Pavel Reichl +Date: Mon, 28 Sep 2020 17:31:18 -0400 +Subject: [PATCH] mkfs.xfs: fix ASSERT on too-small device with stripe geometry + +When a too-small device is created with stripe geometry, we hit an +assert in align_ag_geometry(): + +mkfs.xfs: xfs_mkfs.c:2834: align_ag_geometry: Assertion `cfg->agcount != 0' failed. + +This is because align_ag_geometry() finds that the size of the last +(only) AG is too small, and attempts to trim it off. Obviously 0 +AGs is invalid, and we hit the ASSERT. + +Reported-by: Zdenek Kabelac +Suggested-by: Dave Chinner +Signed-off-by: Pavel Reichl +Reviewed-by: Christoph Hellwig +Reviewed-by: Carlos Maiolino +Signed-off-by: Eric Sandeen +--- + include/xfs_multidisk.h | 14 +++++++------- + mkfs/xfs_mkfs.c | 6 +++--- + 2 files changed, 10 insertions(+), 10 deletions(-) + +diff --git a/include/xfs_multidisk.h b/include/xfs_multidisk.h +index 1b9936e..abfb50c 100644 +--- a/include/xfs_multidisk.h ++++ b/include/xfs_multidisk.h +@@ -14,7 +14,6 @@ + #define XFS_DFL_BLOCKSIZE_LOG 12 /* 4096 byte blocks */ + #define XFS_DINODE_DFL_LOG 8 /* 256 byte inodes */ + #define XFS_DINODE_DFL_CRC_LOG 9 /* 512 byte inodes for CRCs */ +-#define XFS_MIN_DATA_BLOCKS 100 + #define XFS_MIN_INODE_PERBLOCK 2 /* min inodes per block */ + #define XFS_DFL_IMAXIMUM_PCT 25 /* max % of space for inodes */ + #define XFS_MIN_REC_DIRSIZE 12 /* 4096 byte dirblocks (V2) */ +@@ -25,13 +24,14 @@ + * accept w/o warnings + */ + +-#define XFS_AG_BYTES(bblog) ((long long)BBSIZE << (bblog)) +-#define XFS_AG_MIN_BYTES ((XFS_AG_BYTES(15))) /* 16 MB */ +-#define XFS_AG_MAX_BYTES ((XFS_AG_BYTES(31))) /* 1 TB */ +-#define XFS_AG_MIN_BLOCKS(blog) (XFS_AG_MIN_BYTES >> (blog)) +-#define XFS_AG_MAX_BLOCKS(blog) ((XFS_AG_MAX_BYTES - 1) >> (blog)) ++#define XFS_AG_BYTES(bblog) ((long long)BBSIZE << (bblog)) ++#define XFS_MIN_DATA_BLOCKS(cfg) (XFS_AG_MIN_BLOCKS((cfg)->blocklog)) ++#define XFS_AG_MIN_BYTES ((XFS_AG_BYTES(15))) /* 16 MB */ ++#define XFS_AG_MAX_BYTES ((XFS_AG_BYTES(31))) /* 1 TB */ ++#define XFS_AG_MIN_BLOCKS(blog) (XFS_AG_MIN_BYTES >> (blog)) ++#define XFS_AG_MAX_BLOCKS(blog) ((XFS_AG_MAX_BYTES - 1) >> (blog)) + +-#define XFS_MAX_AGNUMBER ((xfs_agnumber_t)(NULLAGNUMBER - 1)) ++#define XFS_MAX_AGNUMBER ((xfs_agnumber_t)(NULLAGNUMBER - 1)) + + /* + * These values define what we consider a "multi-disk" filesystem. That is, a +diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c +index a687f38..204dfff 100644 +--- a/mkfs/xfs_mkfs.c ++++ b/mkfs/xfs_mkfs.c +@@ -2530,10 +2530,10 @@ _("size %s specified for data subvolume is too large, maximum is %lld blocks\n") + cfg->dblocks = DTOBT(xi->dsize, cfg->blocklog); + } + +- if (cfg->dblocks < XFS_MIN_DATA_BLOCKS) { ++ if (cfg->dblocks < XFS_MIN_DATA_BLOCKS(cfg)) { + fprintf(stderr, +-_("size %lld of data subvolume is too small, minimum %d blocks\n"), +- (long long)cfg->dblocks, XFS_MIN_DATA_BLOCKS); ++_("size %lld of data subvolume is too small, minimum %lld blocks\n"), ++ (long long)cfg->dblocks, XFS_MIN_DATA_BLOCKS(cfg)); + usage(); + } + +-- +1.8.3.1 + diff --git a/xfsprogs.spec b/xfsprogs.spec index 98bf66a..4687ee9 100644 --- a/xfsprogs.spec +++ b/xfsprogs.spec @@ -1,12 +1,14 @@ Name: xfsprogs Version: 5.6.0 -Release: 2 +Release: 3 Summary: Administration and debugging tools for the XFS file system License: GPL+ and LGPLv2+ URL: https://xfs.wiki.kernel.org Source0: http://kernel.org/pub/linux/utils/fs/xfs/xfsprogs/%{name}-%{version}.tar.xz +Patch1: 0001-mkfs.xfs-fix-ASSERT-on-too-small-device-with-stripe-.patch + BuildRequires: libtool libattr-devel libuuid-devel gcc git BuildRequires: readline-devel libblkid-devel >= 2.30 lvm2-devel libicu-devel >= 62.0 @@ -98,6 +100,10 @@ rm -rf %{buildroot}%{_datadir}/doc/xfsprogs/ %changelog +* Wed Mar 02 2022 Zhiqiang Liu - 5.6.0-3 +- mkfs.xfs: fix ASSERT on to-small device with stripe geometry. + Fix issue: https://gitee.com/src-openeuler/xfsprogs/issues/I4RZKQ + * Wed Nov 25 2020 haowenchao - 5.6.0-2 - Split xfsprogs-xfs_scrub and the xfsprogs recommends it. -- Gitee