On Tue, Dec 14, 2021 at 02:18:09PM +0530, Chandan Babu R wrote: > Enabling nrext64 option on mkfs.xfs command line extends the maximum values of > inode data and attr fork extent counters to 2^48 - 1 and 2^32 - 1 > respectively. This also sets the XFS_SB_FEAT_INCOMPAT_NREXT64 incompat flag > on the superblock preventing older kernels from mounting such a filesystem. > > Signed-off-by: Chandan Babu R <chandan.babu@xxxxxxxxxx> Looks reasonable. There's a silly nit that mtk prefers that each sentence in a Linux man page start on a separate line, but I'll let Eric decide if he cares about that for xfsprogs manpages. Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> --D > --- > man/man8/mkfs.xfs.8 | 7 +++++++ > mkfs/xfs_mkfs.c | 23 +++++++++++++++++++++++ > 2 files changed, 30 insertions(+) > > diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8 > index a7f70285..923940e3 100644 > --- a/man/man8/mkfs.xfs.8 > +++ b/man/man8/mkfs.xfs.8 > @@ -639,6 +639,13 @@ space over time such that no free extents are large enough to > accommodate a chunk of 64 inodes. Without this feature enabled, inode > allocations can fail with out of space errors under severe fragmented > free space conditions. > +.TP > +.BI nrext64[= value] > +Extend maximum values of inode data and attr fork extent counters from 2^31 - > +1 and 2^15 - 1 to 2^48 - 1 and 2^32 - 1 respectively. If the value is > +omitted, 1 is assumed. This feature is disabled by default. This feature is > +only available for filesystems formatted with -m crc=1. > +.TP > .RE > .PP > .PD 0 > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 53904677..6609776f 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -78,6 +78,7 @@ enum { > I_ATTR, > I_PROJID32BIT, > I_SPINODES, > + I_NREXT64, > I_MAX_OPTS, > }; > > @@ -432,6 +433,7 @@ static struct opt_params iopts = { > [I_ATTR] = "attr", > [I_PROJID32BIT] = "projid32bit", > [I_SPINODES] = "sparse", > + [I_NREXT64] = "nrext64", > }, > .subopt_params = { > { .index = I_ALIGN, > @@ -480,6 +482,12 @@ static struct opt_params iopts = { > .maxval = 1, > .defaultval = 1, > }, > + { .index = I_NREXT64, > + .conflicts = { { NULL, LAST_CONFLICT } }, > + .minval = 0, > + .maxval = 1, > + .defaultval = 1, > + } > }, > }; > > @@ -804,6 +812,7 @@ struct sb_feat_args { > bool bigtime; /* XFS_SB_FEAT_INCOMPAT_BIGTIME */ > bool nodalign; > bool nortalign; > + bool nrext64; > }; > > struct cli_params { > @@ -1585,6 +1594,9 @@ inode_opts_parser( > case I_SPINODES: > cli->sb_feat.spinodes = getnum(value, opts, subopt); > break; > + case I_NREXT64: > + cli->sb_feat.nrext64 = getnum(value, opts, subopt); > + break; > default: > return -EINVAL; > } > @@ -2153,6 +2165,14 @@ _("timestamps later than 2038 not supported without CRC support\n")); > usage(); > } > cli->sb_feat.bigtime = false; > + > + if (cli->sb_feat.nrext64 && > + cli_opt_set(&iopts, I_NREXT64)) { > + fprintf(stderr, > +_("64 bit extent count not supported without CRC support\n")); > + usage(); > + } > + cli->sb_feat.nrext64 = false; > } > > if (!cli->sb_feat.finobt) { > @@ -3145,6 +3165,8 @@ sb_set_features( > sbp->sb_features_incompat |= XFS_SB_FEAT_INCOMPAT_SPINODES; > } > > + if (fp->nrext64) > + sbp->sb_features_incompat |= XFS_SB_FEAT_INCOMPAT_NREXT64; > } > > /* > @@ -3854,6 +3876,7 @@ main( > .nodalign = false, > .nortalign = false, > .bigtime = false, > + .nrext64 = false, > }, > }; > > -- > 2.30.2 >