]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
mkfs: make use of xfs_validate_stripe_geometry()
authorGao Xiang <hsiangkao@redhat.com>
Wed, 24 Feb 2021 01:20:57 +0000 (20:20 -0500)
committerEric Sandeen <sandeen@sandeen.net>
Wed, 24 Feb 2021 01:20:57 +0000 (20:20 -0500)
Check stripe numbers in calc_stripe_factors() by using
xfs_validate_stripe_geometry().

Signed-off-by: Gao Xiang <hsiangkao@redhat.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/libxfs_api_defs.h
mkfs/xfs_mkfs.c

index 9a00ce6609b39b5ca671473a826f838ca3c8efe3..e4192e1b1eaa25a41f93216f06d060dd3299f714 100644 (file)
 #define xfs_trans_roll                 libxfs_trans_roll
 #define xfs_trim_extent                        libxfs_trim_extent
 
+#define xfs_validate_stripe_geometry   libxfs_validate_stripe_geometry
 #define xfs_verify_agbno               libxfs_verify_agbno
 #define xfs_verify_agino               libxfs_verify_agino
 #define xfs_verify_cksum               libxfs_verify_cksum
index 964299d37027912865e03a8c5f7146659d0377c8..36b274d5ccb29705134fd223c9fd2de6978c9532 100644 (file)
@@ -2475,28 +2475,22 @@ _("both data su and data sw options must be specified\n"));
                        usage();
                }
 
-               if (dsu % cfg->sectorsize) {
+               big_dswidth = (long long int)dsu * dsw;
+               if (BTOBBT(big_dswidth) > INT_MAX) {
                        fprintf(stderr,
-_("data su must be a multiple of the sector size (%d)\n"), cfg->sectorsize);
+_("data stripe width (%lld) is too large of a multiple of the data stripe unit (%d)\n"),
+                               big_dswidth, dsu);
                        usage();
                }
 
-               dsunit  = (int)BTOBBT(dsu);
-               big_dswidth = (long long int)dsunit * dsw;
-               if (big_dswidth > INT_MAX) {
-                       fprintf(stderr,
-_("data stripe width (%lld) is too large of a multiple of the data stripe unit (%d)\n"),
-                               big_dswidth, dsunit);
+               if (!libxfs_validate_stripe_geometry(NULL, dsu, big_dswidth,
+                                                    cfg->sectorsize, false))
                        usage();
-               }
-               dswidth = big_dswidth;
-       }
 
-       if ((dsunit && !dswidth) || (!dsunit && dswidth) ||
-           (dsunit && (dswidth % dsunit != 0))) {
-               fprintf(stderr,
-_("data stripe width (%d) must be a multiple of the data stripe unit (%d)\n"),
-                       dswidth, dsunit);
+               dsunit = BTOBBT(dsu);
+               dswidth = BTOBBT(big_dswidth);
+       } else if (!libxfs_validate_stripe_geometry(NULL, BBTOB(dsunit),
+                       BBTOB(dswidth), cfg->sectorsize, false)) {
                usage();
        }
 
@@ -2514,11 +2508,12 @@ _("data stripe width (%d) must be a multiple of the data stripe unit (%d)\n"),
 
        /* if no stripe config set, use the device default */
        if (!dsunit) {
-               /* Ignore nonsense from device.  XXX add more validation */
-               if (ft->dsunit && ft->dswidth == 0) {
+               /* Ignore nonsense from device report. */
+               if (!libxfs_validate_stripe_geometry(NULL, BBTOB(ft->dsunit),
+                               BBTOB(ft->dswidth), 0, true)) {
                        fprintf(stderr,
-_("%s: Volume reports stripe unit of %d bytes and stripe width of 0, ignoring.\n"),
-                               progname, BBTOB(ft->dsunit));
+_("%s: Volume reports invalid stripe unit (%d) and stripe width (%d), ignoring.\n"),
+                               progname, BBTOB(ft->dsunit), BBTOB(ft->dswidth));
                        ft->dsunit = 0;
                        ft->dswidth = 0;
                } else {