]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
mkfs: more sunit/swidth sanity checking
authorEric Sandeen <sandeen@redhat.com>
Fri, 2 Feb 2018 15:32:45 +0000 (09:32 -0600)
committerEric Sandeen <sandeen@redhat.com>
Fri, 2 Feb 2018 15:32:45 +0000 (09:32 -0600)
This fixes 2 issues with stripe geometry validation.

# mkfs.xfs -d sunit=64,swidth=0 ...
both data sunit and data swidth options must be specified

But I did specify it, I specified 0!

So use cli_opt_set() to detect that it was specified.

But we can't allow the above configuration (in fact it causes
a % 0 later in mkfs), so catch it in the "swidth must be a
multiple of sunit" test a bit further down.

(sunit=0,swidth=0 /is/ valid, it's used to override disk
geometry if desired.)

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
mkfs/xfs_mkfs.c

index f527476f559ff7ced7db5353a5a39fa3c82614b2..219b209b4740064bed6d21f581a966e5d1821b46 100644 (file)
@@ -2233,7 +2233,7 @@ calc_stripe_factors(
                dsw = cli->dsw;
 
        /* data sunit/swidth options */
-       if ((dsunit && !dswidth) || (!dsunit && dswidth)) {
+       if (cli_opt_set(&dopts, D_SUNIT) != cli_opt_set(&dopts, D_SWIDTH)) {
                fprintf(stderr,
 _("both data sunit and data swidth options must be specified\n"));
                usage();
@@ -2241,7 +2241,7 @@ _("both data sunit and data swidth options must be specified\n"));
 
        /* convert dsu/dsw to dsunit/dswidth and use them from now on */
        if (dsu || dsw) {
-               if ((dsu && !dsw) || (!dsu && dsw)) {
+               if (cli_opt_set(&dopts, D_SU) != cli_opt_set(&dopts, D_SW)) {
                        fprintf(stderr,
 _("both data su and data sw options must be specified\n"));
                        usage();
@@ -2264,7 +2264,7 @@ _("data stripe width (%lld) is too large of a multiple of the data stripe unit (
                dswidth = big_dswidth;
        }
 
-       if (dsunit && (dswidth % dsunit != 0)) {
+       if (dsunit && (!dswidth || (dswidth % dsunit != 0))) {
                fprintf(stderr,
 _("data stripe width (%d) must be a multiple of the data stripe unit (%d)\n"),
                        dswidth, dsunit);