]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
mkfs: factor rt device validation
authorDave Chinner <dchinner@redhat.com>
Wed, 6 Dec 2017 23:14:27 +0000 (17:14 -0600)
committerEric Sandeen <sandeen@redhat.com>
Wed, 6 Dec 2017 23:14:27 +0000 (17:14 -0600)
Signed-Off-By: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
mkfs/xfs_mkfs.c

index ee1d7f78e64104bb9063538bf38f881fb0f7aba5..e30950c57f5ae4aef6daefb14591d7cdbdc07581 100644 (file)
@@ -2683,6 +2683,64 @@ reported by the device (%u).\n"),
        }
 }
 
+static void
+validate_rtdev(
+       struct mkfs_params      *cfg,
+       struct cli_params       *cli,
+       char                    **devname)
+{
+       struct libxfs_xinit     *xi = cli->xi;
+
+       *devname = NULL;
+
+       if (!xi->rtdev) {
+               if (cli->rtsize) {
+                       fprintf(stderr,
+_("size specified for non-existent rt subvolume\n"));
+                       usage();
+               }
+
+               *devname = _("none");
+               cfg->rtblocks = 0;
+               cfg->rtextents = 0;
+               cfg->rtbmblocks = 0;
+               return;
+       }
+       if (!xi->rtsize) {
+               fprintf(stderr, _("Invalid zero length rt subvolume found\n"));
+               usage();
+       }
+
+       /* volume rtdev */
+       if (xi->volname)
+               *devname = _("volume rt");
+       else
+               *devname = xi->rtname;
+
+       if (cli->rtsize) {
+               if (cfg->rtblocks > DTOBT(xi->rtsize, cfg->blocklog)) {
+                       fprintf(stderr,
+_("size %s specified for rt subvolume is too large, maxi->um is %lld blocks\n"),
+                               cli->rtsize,
+                               (long long)DTOBT(xi->rtsize, cfg->blocklog));
+                       usage();
+               }
+               if (xi->rtbsize > cfg->sectorsize) {
+                       fprintf(stderr, _(
+"Warning: the realtime subvolume sector size %u is less than the sector size\n\
+reported by the device (%u).\n"),
+                               cfg->sectorsize, xi->rtbsize);
+               }
+       } else {
+               /* grab volume size */
+               cfg->rtblocks = DTOBT(xi->rtsize, cfg->blocklog);
+       }
+
+       cfg->rtextents = cfg->rtblocks / cfg->rtextblocks;
+       cfg->rtbmblocks = (xfs_extlen_t)howmany(cfg->rtextents,
+                                               NBBY * cfg->blocksize);
+}
+
 static void
 print_mkfs_cfg(
        struct mkfs_params      *cfg,
@@ -3362,7 +3420,6 @@ main(
        xfs_extlen_t            rtextblocks;
        xfs_rtblock_t           rtextents;
        char                    *rtfile;
-       char                    *rtsize;
        xfs_sb_t                *sbp;
        int                     sectorlog;
        uint64_t                tmp_agsize;
@@ -3436,7 +3493,7 @@ main(
        logagno = logblocks = rtblocks = rtextblocks = 0;
        imaxpct = inodelog = inopblock = isize = 0;
        dfile = logfile = rtfile = NULL;
-       logsize = rtsize = protofile = NULL;
+       logsize = protofile = NULL;
        dsunit = dswidth = lalign = lsunit = 0;
        nodsflag = 0;
        force_overwrite = 0;
@@ -3455,6 +3512,7 @@ main(
                        break;
                case 'b':
                case 'n':
+               case 'r':
                case 's':
                        parse_subopts(c, optarg, &cli);
                        break;
@@ -3516,14 +3574,6 @@ main(
                case 'q':
                        quiet = 1;
                        break;
-               case 'r':
-                       parse_subopts(c, optarg, &cli);
-
-                       /* temp don't break code */
-                       rtsize = cli.rtsize;
-                       /* end temp don't break code */
-                       break;
-                       break;
                case 'V':
                        printf(_("%s version %s\n"), progname, VERSION);
                        exit(0);
@@ -3579,6 +3629,7 @@ main(
        open_devices(&cfg, &xi, (discard && !dry_run));
        validate_datadev(&cfg, &cli);
        validate_logdev(&cfg, &cli, &logfile);
+       validate_rtdev(&cfg, &cli, &rtfile);
 
        /* temp don't break code */
        sectorsize = cfg.sectorsize;
@@ -3598,48 +3649,14 @@ main(
        logblocks = cfg.logblocks;
        rtblocks = cfg.rtblocks;
        rtextblocks = cfg.rtextblocks;
+       nbmblocks = cfg.rtbmblocks;
+       rtextents = cfg.rtextents;
        dsunit = cfg.dsunit;
        dswidth = cfg.dswidth;
        lsunit = cfg.lsunit;
        nodsflag = cfg.sb_feat.nodalign;
        /* end temp don't break code */
 
-       if (xi.rtname)
-               rtfile = xi.rtname;
-       else
-       if (xi.volname && xi.rtdev)
-               rtfile = _("volume rt");
-       else if (!xi.rtdev)
-               rtfile = _("none");
-
-       if (rtsize && xi.rtsize > 0 && xi.rtbsize > sectorsize) {
-               fprintf(stderr, _(
-"Warning: the realtime subvolume sector size %u is less than the sector size\n\
-reported by the device (%u).\n"),
-                       sectorsize, xi.rtbsize);
-       }
-
-       if (rtsize && xi.rtsize > 0 && rtblocks > DTOBT(xi.rtsize, blocklog)) {
-               fprintf(stderr,
-                       _("size %s specified for rt subvolume is too large, "
-                       "maximum is %lld blocks\n"),
-                       rtsize, (long long)DTOBT(xi.rtsize, blocklog));
-               usage();
-       } else if (!rtsize && xi.rtsize > 0)
-               rtblocks = DTOBT(xi.rtsize, blocklog);
-       else if (rtsize && !xi.rtdev) {
-               fprintf(stderr,
-                       _("size specified for non-existent rt subvolume\n"));
-               usage();
-       }
-       if (xi.rtdev) {
-               rtextents = rtblocks / rtextblocks;
-               nbmblocks = (xfs_extlen_t)howmany(rtextents, NBBY * blocksize);
-       } else {
-               rtextents = rtblocks = 0;
-               nbmblocks = 0;
-       }
-
        if (dasize) {           /* User-specified AG size */
                /*
                 * Check specified agsize is a multiple of blocksize.