]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
mkfs: factor log sector size 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)
This also adds a check that disallows changing the sector size on
internal logs.

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 a59ab569df29e1debc5aa598b8c62f608eae9d3f..2a94a54216a65132379c6487c5e52a2168c44e59 100644 (file)
@@ -2052,6 +2052,61 @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n"),
 
 }
 
+/*
+ * Grab log sector size and validate.
+ *
+ * XXX: should we probe sector size on external log device rather than using
+ * the data device sector size?
+ */
+static void
+validate_log_sectorsize(
+       struct mkfs_params      *cfg,
+       struct cli_params       *cli,
+       struct mkfs_default_params *dft)
+{
+
+       if (cli->loginternal && cli->lsectorsize &&
+           cli->lsectorsize != cfg->sectorsize) {
+               fprintf(stderr,
+_("Can't change sector size on internal log!\n"));
+               usage();
+       }
+
+       if (cli->lsectorsize)
+               cfg->lsectorsize = cli->lsectorsize;
+       else if (cli->loginternal)
+               cfg->lsectorsize = cfg->sectorsize;
+       else
+               cfg->lsectorsize = dft->sectorsize;
+       cfg->lsectorlog = libxfs_highbit32(cfg->lsectorsize);
+
+       if (cfg->lsectorsize < XFS_MIN_SECTORSIZE ||
+           cfg->lsectorsize > XFS_MAX_SECTORSIZE ||
+           cfg->lsectorsize > cfg->blocksize) {
+               fprintf(stderr, _("illegal log sector size %d\n"),
+                       cfg->lsectorsize);
+               usage();
+       }
+       if (cfg->lsectorsize > XFS_MIN_SECTORSIZE) {
+               if (cli->sb_feat.log_version < 2) {
+                       /* user specified non-default log version */
+                       fprintf(stderr,
+_("Version 1 logs do not support sector size %d\n"),
+                               cfg->lsectorsize);
+                       usage();
+               }
+       }
+
+       /* if lsu or lsunit was specified, automatically use v2 logs */
+       if ((cli_opt_set(&lopts, L_SU) || cli_opt_set(&lopts, L_SUNIT)) &&
+           cli->sb_feat.log_version == 1) {
+               fprintf(stderr,
+_("log stripe unit specified, using v2 logs\n"));
+               cli->sb_feat.log_version = 2;
+       }
+
+}
+
 static void
 print_mkfs_cfg(
        struct mkfs_params      *cfg,
@@ -2728,8 +2783,6 @@ main(
        int                     lsunitflag;
        int                     lsectorlog;
        int                     lsectorsize;
-       int                     lslflag;
-       int                     lssflag;
        int                     lsu;
        int                     lsunit;
        int                     min_logblocks;
@@ -2812,9 +2865,13 @@ main(
        memcpy(&cli.sb_feat, &dft.sb_feat, sizeof(cli.sb_feat));
        memcpy(&cli.fsx, &dft.fsx, sizeof(cli.fsx));
 
-       lslflag = lssflag = 0;
-       lsectorlog = 0;
-       lsectorsize = 0;
+       /*
+        * Initialise cli parameters that can be set to zero to an appropriate
+        * value so we can tell if they have been set or or changed from the
+        * default value.
+        */
+       cli.loginternal = 1;    /* internal by default */
+
        agsize = daflag = dasize = dblocks = 0;
        ilflag = imflag = ipflag = isflag = 0;
        liflag = laflag = lsflag = lsuflag = lsunitflag = ldflag = lvflag = 0;
@@ -2843,6 +2900,7 @@ main(
                        force_overwrite = 1;
                        break;
                case 'b':
+               case 's':
                        parse_subopts(c, optarg, &cli);
                        break;
                case 'd':
@@ -2896,8 +2954,6 @@ main(
                        loginternal = cli.loginternal;
                        logfile = xi.logname;
                        logsize = cli.logsize;
-                       lsectorsize = cli.lsectorsize;
-                       lsectorlog = libxfs_highbit32(lsectorsize);
 
                        lsunit = cli.lsunit;
                        lsunitflag = cli_opt_set(&lopts, L_SUNIT);
@@ -2911,8 +2967,6 @@ main(
                        ldflag = cli_opt_set(&lopts, L_NAME) ||
                                 cli_opt_set(&lopts, L_DEV);
                        lvflag = cli_opt_set(&lopts, L_VERSION);
-                       lslflag = cli_opt_set(&lopts, L_SECTLOG);
-                       lssflag = cli_opt_set(&lopts, L_SECTSIZE);
                        /* end temp don't break code */
                        break;
                case 'L':
@@ -2961,17 +3015,6 @@ main(
                        norsflag = cli.sb_feat.nortalign;
                        /* end temp don't break code */
                        break;
-               case 's':
-                       parse_subopts(c, optarg, &cli);
-
-                       /* temp don't break code */
-                       lsectorsize = cli.lsectorsize;
-                       lsectorlog = libxfs_highbit32(lsectorsize);
-                       lslflag = cli_opt_set(&sopts, S_LOG) ||
-                                          cli_opt_set(&sopts, S_SECTLOG);
-
-                       lssflag = cli_opt_set(&sopts, S_SIZE) ||
-                                          cli_opt_set(&sopts, S_SECTSIZE);
                        break;
                case 'V':
                        printf(_("%s version %s\n"), progname, VERSION);
@@ -3004,23 +3047,18 @@ main(
        validate_blocksize(&cfg, &cli, &dft);
        validate_sectorsize(&cfg, &cli, &dft, &ft, dfile, dry_run,
                            force_overwrite);
+       validate_log_sectorsize(&cfg, &cli, &dft);
 
        /* temp don't break code */
        sectorsize = cfg.sectorsize;
        sectorlog = cfg.sectorlog;
        blocksize = cfg.blocksize;
        blocklog = cfg.blocklog;
+       lsectorsize = cfg.lsectorsize;
+       lsectorlog = cfg.lsectorlog;
+       sb_feat = cfg.sb_feat;
        /* end temp don't break code */
 
-       if (lsectorsize < XFS_MIN_SECTORSIZE ||
-           lsectorsize > XFS_MAX_SECTORSIZE || lsectorsize > blocksize) {
-               fprintf(stderr, _("illegal log sector size %d\n"), lsectorsize);
-               usage();
-       } else if (lsectorsize > XFS_MIN_SECTORSIZE && !lsu && !lsunit) {
-               lsu = blocksize;
-               sb_feat.log_version = 2;
-       }
-
        /*
         * Now we have blocks and sector sizes set up, check parameters that are
         * no longer optional for CRC enabled filesystems.  Catch them up front
@@ -3270,13 +3308,6 @@ _("rmapbt not supported with realtime devices\n"));
                exit(1);
        }
 
-       /* if lsu or lsunit was specified, automatically use v2 logs */
-       if ((lsu || lsunit) && sb_feat.log_version == 1) {
-               fprintf(stderr,
-                       _("log stripe unit specified, using v2 logs\n"));
-               sb_feat.log_version = 2;
-       }
-
        calc_stripe_factors(dsu, dsw, sectorsize, lsu, lsectorsize,
                                &dsunit, &dswidth, &lsunit);