All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Sandeen <sandeen@redhat.com>
To: xfs <linux-xfs@vger.kernel.org>
Cc: Zdenek Kabelac <zkabelac@redhat.com>
Subject: [PATCH] mkfs.xfs: fix ASSERT on too-small device with stripe geometry
Date: Mon, 14 Sep 2020 13:26:01 -0500	[thread overview]
Message-ID: <f06e8b9a-d5c8-f91f-8637-0b9f625d9d48@redhat.com> (raw)

When a too-small device is created with stripe geometry, we hit an
assert in align_ag_geometry():

# truncate --size=10444800 testfile
# mkfs.xfs -dsu=65536,sw=1 testfile 
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.

Fix this by skipping the last-ag-trim if there is only one AG, and
add a new test to validate_ag_geometry() which offers a very specific,
clear warning if the device (in dblocks) is smaller than the minimum
allowed AG size.

Reported-by: Zdenek Kabelac <zkabelac@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---

diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
index a687f385..da8c5986 100644
--- a/mkfs/xfs_mkfs.c
+++ b/mkfs/xfs_mkfs.c
@@ -1038,6 +1038,15 @@ validate_ag_geometry(
 	uint64_t	agsize,
 	uint64_t	agcount)
 {
+	/* Is this device simply too small? */
+	if (dblocks < XFS_AG_MIN_BLOCKS(blocklog)) {
+		fprintf(stderr,
+	_("device (%lld blocks) too small, need at least %lld blocks\n"),
+			(long long)dblocks,
+			(long long)XFS_AG_MIN_BLOCKS(blocklog));
+		usage();
+	}
+
 	if (agsize < XFS_AG_MIN_BLOCKS(blocklog)) {
 		fprintf(stderr,
 	_("agsize (%lld blocks) too small, need at least %lld blocks\n"),
@@ -2827,11 +2836,12 @@ validate:
 	 * and drop the blocks.
 	 */
 	if (cfg->dblocks % cfg->agsize != 0 &&
+	     cfg->agcount > 1 &&
 	     (cfg->dblocks % cfg->agsize < XFS_AG_MIN_BLOCKS(cfg->blocklog))) {
+printf("%d %d %d\n", cfg->dblocks, cfg->agsize, cfg->dblocks % cfg->agsize);
 		ASSERT(!cli_opt_set(&dopts, D_AGCOUNT));
 		cfg->dblocks = (xfs_rfsblock_t)((cfg->agcount - 1) * cfg->agsize);
 		cfg->agcount--;
-		ASSERT(cfg->agcount != 0);
 	}
 
 	validate_ag_geometry(cfg->blocklog, cfg->dblocks,


             reply	other threads:[~2020-09-14 18:26 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-14 18:26 Eric Sandeen [this message]
2020-09-14 18:58 ` [PATCH] mkfs.xfs: fix ASSERT on too-small device with stripe geometry Darrick J. Wong
2020-09-14 19:00 ` [PATCH V2] " Eric Sandeen
2020-09-14 19:24   ` Darrick J. Wong
2020-09-14 22:12 ` [PATCH] " Dave Chinner
2020-09-14 22:29   ` Eric Sandeen
2020-09-14 23:33     ` Dave Chinner
2020-09-14 23:41       ` Eric Sandeen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=f06e8b9a-d5c8-f91f-8637-0b9f625d9d48@redhat.com \
    --to=sandeen@redhat.com \
    --cc=linux-xfs@vger.kernel.org \
    --cc=zkabelac@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.