From 9eb0d6eb9066daa621e710139c8c8d50fedbabcf Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Fri, 20 Nov 2020 17:03:27 -0500 Subject: [PATCH] mkfs: enable the inode btree counter feature Teach mkfs how to enable the inode btree counter feature. Signed-off-by: Darrick J. Wong Reviewed-by: Brian Foster Signed-off-by: Eric Sandeen --- diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8 index 9d6f315..45b150f 100644 --- a/man/man8/mkfs.xfs.8 +++ b/man/man8/mkfs.xfs.8 @@ -188,6 +188,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. diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 16819d8..87f15f4 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -117,6 +117,7 @@ enum { M_UUID, M_RMAPBT, M_REFLINK, + M_INOBTCNT, M_MAX_OPTS, }; @@ -651,6 +652,7 @@ static struct opt_params mopts = { [M_UUID] = "uuid", [M_RMAPBT] = "rmapbt", [M_REFLINK] = "reflink", + [M_INOBTCNT] = "inobtcount", }, .subopt_params = { { .index = M_CRC, @@ -681,6 +683,12 @@ static struct opt_params mopts = { .maxval = 1, .defaultval = 1, }, + { .index = M_INOBTCNT, + .conflicts = { { NULL, LAST_CONFLICT } }, + .minval = 0, + .maxval = 1, + .defaultval = 1, + }, }, }; @@ -731,6 +739,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; }; @@ -853,7 +862,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\ @@ -1607,6 +1617,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; } @@ -2037,6 +2050,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) && @@ -3002,6 +3031,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. @@ -3917,6 +3948,7 @@ main( .spinodes = true, .rmapbt = false, .reflink = true, + .inobtcnt = false, .parent_pointers = false, .nodalign = false, .nortalign = false,