]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
mkfs: enable the inode btree counter feature
authorDarrick J. Wong <darrick.wong@oracle.com>
Fri, 20 Nov 2020 22:03:27 +0000 (17:03 -0500)
committerEric Sandeen <sandeen@sandeen.net>
Fri, 20 Nov 2020 22:03:27 +0000 (17:03 -0500)
Teach mkfs how to enable the inode btree counter feature.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
man/man8/mkfs.xfs.8
mkfs/xfs_mkfs.c

index 0a7858748457a570b6a23f2c1029267cdfe94918..1a6a5f93f0eadc49b05722df9085449006cf00c1 100644 (file)
@@ -184,6 +184,21 @@ option set. When the option
 .B \-m crc=0
 is used, the free inode btree feature is not supported and is disabled.
 .TP
+.BI inobtcount= value
+This option causes the filesystem to record the number of blocks used by
+the inode btree and the free inode btree.
+This can be used to reduce mount times when the free inode btree is enabled.
+.IP
+By default,
+.B mkfs.xfs
+will not enable this option.
+This feature is only available for filesystems created with the (default)
+.B \-m finobt=1
+option set.
+When the option
+.B \-m finobt=0
+is used, the inode btree counter feature is not supported and is disabled.
+.TP
 .BI uuid= value
 Use the given value as the filesystem UUID for the newly created filesystem.
 The default is to generate a random UUID.
index 8fe149d74b0a8041ce1f423f33f6a499ecc4f557..1f98743f8102b7720026b8e41fcad1571fbe969c 100644 (file)
@@ -119,6 +119,7 @@ enum {
        M_UUID,
        M_RMAPBT,
        M_REFLINK,
+       M_INOBTCNT,
        M_MAX_OPTS,
 };
 
@@ -660,6 +661,7 @@ static struct opt_params mopts = {
                [M_UUID] = "uuid",
                [M_RMAPBT] = "rmapbt",
                [M_REFLINK] = "reflink",
+               [M_INOBTCNT] = "inobtcount",
        },
        .subopt_params = {
                { .index = M_CRC,
@@ -690,6 +692,12 @@ static struct opt_params mopts = {
                  .maxval = 1,
                  .defaultval = 1,
                },
+               { .index = M_INOBTCNT,
+                 .conflicts = { { NULL, LAST_CONFLICT } },
+                 .minval = 0,
+                 .maxval = 1,
+                 .defaultval = 1,
+               },
        },
 };
 
@@ -740,6 +748,7 @@ struct sb_feat_args {
        bool    spinodes;               /* XFS_SB_FEAT_INCOMPAT_SPINODES */
        bool    rmapbt;                 /* XFS_SB_FEAT_RO_COMPAT_RMAPBT */
        bool    reflink;                /* XFS_SB_FEAT_RO_COMPAT_REFLINK */
+       bool    inobtcnt;               /* XFS_SB_FEAT_RO_COMPAT_INOBTCNT */
        bool    nodalign;
        bool    nortalign;
 };
@@ -862,7 +871,8 @@ usage( void )
 {
        fprintf(stderr, _("Usage: %s\n\
 /* blocksize */                [-b size=num]\n\
-/* metadata */         [-m crc=0|1,finobt=0|1,uuid=xxx,rmapbt=0|1,reflink=0|1]\n\
+/* metadata */         [-m crc=0|1,finobt=0|1,uuid=xxx,rmapbt=0|1,reflink=0|1,\n\
+                           inobtcnt=0|1]\n\
 /* data subvol */      [-d agcount=n,agsize=n,file,name=xxx,size=num,\n\
                            (sunit=value,swidth=value|su=num,sw=num|noalign),\n\
                            sectsize=num\n\
@@ -1563,6 +1573,9 @@ meta_opts_parser(
        case M_REFLINK:
                cli->sb_feat.reflink = getnum(value, opts, subopt);
                break;
+       case M_INOBTCNT:
+               cli->sb_feat.inobtcnt = getnum(value, opts, subopt);
+               break;
        default:
                return -EINVAL;
        }
@@ -1986,6 +1999,22 @@ _("reflink not supported without CRC support\n"));
                        usage();
                }
                cli->sb_feat.reflink = false;
+
+               if (cli->sb_feat.inobtcnt && cli_opt_set(&mopts, M_INOBTCNT)) {
+                       fprintf(stderr,
+_("inode btree counters not supported without CRC support\n"));
+                       usage();
+               }
+               cli->sb_feat.inobtcnt = false;
+       }
+
+       if (!cli->sb_feat.finobt) {
+               if (cli->sb_feat.inobtcnt && cli_opt_set(&mopts, M_INOBTCNT)) {
+                       fprintf(stderr,
+_("inode btree counters not supported without finobt support\n"));
+                       usage();
+               }
+               cli->sb_feat.inobtcnt = false;
        }
 
        if ((cli->fsx.fsx_xflags & FS_XFLAG_COWEXTSIZE) &&
@@ -2953,6 +2982,8 @@ sb_set_features(
                sbp->sb_features_ro_compat |= XFS_SB_FEAT_RO_COMPAT_RMAPBT;
        if (fp->reflink)
                sbp->sb_features_ro_compat |= XFS_SB_FEAT_RO_COMPAT_REFLINK;
+       if (fp->inobtcnt)
+               sbp->sb_features_ro_compat |= XFS_SB_FEAT_RO_COMPAT_INOBTCNT;
 
        /*
         * Sparse inode chunk support has two main inode alignment requirements.
@@ -3615,6 +3646,7 @@ main(
                        .spinodes = true,
                        .rmapbt = false,
                        .reflink = true,
+                       .inobtcnt = false,
                        .parent_pointers = false,
                        .nodalign = false,
                        .nortalign = false,