]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
mkfs: factor inode 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)
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 f819f6fa92c641b1f686534d7d7130b589317b9b..f2ba4a7110763d76663d1464b9c403cc5629bfc6 100644 (file)
@@ -2267,6 +2267,54 @@ validate_dirblocksize(
        cfg->dirblocksize = 1 << cfg->dirblocklog;
 }
 
+static void
+validate_inodesize(
+       struct mkfs_params      *cfg,
+       struct cli_params       *cli)
+{
+
+       if (cli->inopblock)
+               cfg->inodelog = cfg->blocklog - libxfs_highbit32(cli->inopblock);
+       else if (cli->inodesize)
+               cfg->inodelog = libxfs_highbit32(cli->inodesize);
+       else if (cfg->sb_feat.crcs_enabled)
+               cfg->inodelog = XFS_DINODE_DFL_CRC_LOG;
+       else
+               cfg->inodelog = XFS_DINODE_DFL_LOG;
+
+       cfg->inodesize = 1 << cfg->inodelog;
+       cfg->inopblock = cfg->blocksize / cfg->inodesize;
+
+       /* input parsing has already validated non-crc inode size range */
+       if (cfg->sb_feat.crcs_enabled &&
+           cfg->inodelog < XFS_DINODE_DFL_CRC_LOG) {
+               fprintf(stderr,
+               _("Minimum inode size for CRCs is %d bytes\n"),
+                       1 << XFS_DINODE_DFL_CRC_LOG);
+               usage();
+       }
+
+       if (cfg->inodesize > cfg->blocksize / XFS_MIN_INODE_PERBLOCK ||
+           cfg->inopblock < XFS_MIN_INODE_PERBLOCK ||
+           cfg->inodesize < XFS_DINODE_MIN_SIZE ||
+           cfg->inodesize > XFS_DINODE_MAX_SIZE) {
+               int     maxsz;
+
+               fprintf(stderr, _("illegal inode size %d\n"), cfg->inodesize);
+               maxsz = MIN(cfg->blocksize / XFS_MIN_INODE_PERBLOCK,
+                           XFS_DINODE_MAX_SIZE);
+               if (XFS_DINODE_MIN_SIZE == maxsz)
+                       fprintf(stderr,
+                       _("allowable inode size with %d byte blocks is %d\n"),
+                               cfg->blocksize, XFS_DINODE_MIN_SIZE);
+               else
+                       fprintf(stderr,
+       _("allowable inode size with %d byte blocks is between %d and %d\n"),
+                               cfg->blocksize, XFS_DINODE_MIN_SIZE, maxsz);
+               exit(1);
+       }
+}
+
 static void
 print_mkfs_cfg(
        struct mkfs_params      *cfg,
@@ -2918,13 +2966,10 @@ main(
        int                     dsflag;
        int                     force_overwrite;
        struct fsxattr          fsx;
-       int                     ilflag;
        int                     imaxpct;
        int                     imflag;
        int                     inodelog;
        int                     inopblock;
-       int                     ipflag;
-       int                     isflag;
        int                     isize;
        char                    *label = NULL;
        int                     laflag;
@@ -3030,7 +3075,7 @@ main(
        cli.loginternal = 1;    /* internal by default */
 
        agsize = daflag = dasize = dblocks = 0;
-       ilflag = imflag = ipflag = isflag = 0;
+       imflag = 0;
        liflag = laflag = lsflag = lsuflag = lsunitflag = ldflag = lvflag = 0;
        loginternal = 1;
        logagno = logblocks = rtblocks = rtextblocks = 0;
@@ -3090,13 +3135,6 @@ main(
                        parse_subopts(c, optarg, &cli);
 
                        /* temp don't break code */
-                       isize = cli.inodesize;
-                       inodelog = libxfs_highbit32(isize);
-                       inopblock = cli.inopblock;
-                       ilflag = cli_opt_set(&iopts, I_LOG);
-                       isflag = cli_opt_set(&iopts, I_SIZE);
-                       ipflag = cli_opt_set(&iopts, I_PERBLOCK);
-
                        imaxpct = cli.imaxpct;
                        imflag = cli_opt_set(&iopts, I_MAXPCT);
                        /* end temp don't break code */
@@ -3195,6 +3233,7 @@ main(
         * the cfg structure for them, not the command line structure.
         */
        validate_dirblocksize(&cfg, &cli);
+       validate_inodesize(&cfg, &cli);
 
        /* temp don't break code */
        sectorsize = cfg.sectorsize;
@@ -3207,6 +3246,9 @@ main(
        sb_feat = cfg.sb_feat;
        dirblocksize = cfg.dirblocksize;
        dirblocklog = cfg.dirblocklog;
+       isize = cfg.inodesize;
+       inodelog = cfg.inodelog;
+       inopblock = cfg.inopblock;
        /* end temp don't break code */
 
        if (dsize) {
@@ -3226,21 +3268,6 @@ main(
                                (long long)dbytes, blocksize,
                                (long long)(dblocks << blocklog));
        }
-       if (ipflag) {
-               inodelog = blocklog - libxfs_highbit32(inopblock);
-               isize = 1 << inodelog;
-       } else if (!ilflag && !isflag) {
-               inodelog = sb_feat.crcs_enabled ? XFS_DINODE_DFL_CRC_LOG
-                                               : XFS_DINODE_DFL_LOG;
-               isize = 1 << inodelog;
-       }
-       if (sb_feat.crcs_enabled && inodelog < XFS_DINODE_DFL_CRC_LOG) {
-               fprintf(stderr,
-               _("Minimum inode size for CRCs is %d bytes\n"),
-                       1 << XFS_DINODE_DFL_CRC_LOG);
-               usage();
-       }
-
        if (logsize) {
                uint64_t logbytes;
 
@@ -3319,28 +3346,6 @@ main(
        }
        ASSERT(rtextblocks);
 
-       /*
-        * Check some argument sizes against mins, maxes.
-        */
-       if (isize > blocksize / XFS_MIN_INODE_PERBLOCK ||
-           isize < XFS_DINODE_MIN_SIZE ||
-           isize > XFS_DINODE_MAX_SIZE) {
-               int     maxsz;
-
-               fprintf(stderr, _("illegal inode size %d\n"), isize);
-               maxsz = MIN(blocksize / XFS_MIN_INODE_PERBLOCK,
-                           XFS_DINODE_MAX_SIZE);
-               if (XFS_DINODE_MIN_SIZE == maxsz)
-                       fprintf(stderr,
-                       _("allowable inode size with %d byte blocks is %d\n"),
-                               blocksize, XFS_DINODE_MIN_SIZE);
-               else
-                       fprintf(stderr,
-       _("allowable inode size with %d byte blocks is between %d and %d\n"),
-                               blocksize, XFS_DINODE_MIN_SIZE, maxsz);
-               exit(1);
-       }
-
        calc_stripe_factors(dsu, dsw, sectorsize, lsu, lsectorsize,
                                &dsunit, &dswidth, &lsunit);