]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
mkfs: Add option to create filesystem with large extent counters
authorChandan Babu R <chandan.babu@oracle.com>
Wed, 22 Jun 2022 19:28:52 +0000 (14:28 -0500)
committerEric Sandeen <sandeen@sandeen.net>
Wed, 22 Jun 2022 19:28:52 +0000 (14:28 -0500)
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.

Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Chandan Babu R <chandan.babu@oracle.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
man/man8/mkfs.xfs.8.in
mkfs/lts_4.19.conf
mkfs/lts_5.10.conf
mkfs/lts_5.15.conf
mkfs/lts_5.4.conf
mkfs/xfs_mkfs.c

index 7b7e4f48d6f3e50066e6111083fbb2ffd812b157..1d8c55f0afd1fc5b6800c3da02e507ba4a57c86f 100644 (file)
@@ -640,6 +640,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
index d21fcb7ec2f98476b7e7c88d6ccc1a940b34c029..751be45e519171d09336b2db7313f4d43e219857 100644 (file)
@@ -2,6 +2,7 @@
 # kernel was released at the end of 2018.
 
 [metadata]
+nrext64=0
 bigtime=0
 crc=1
 finobt=1
index ac00960ef32377b5cb49927b5f1c2095baa29a85..a1c991cec3c57e6408e4c46fca641305c663839f 100644 (file)
@@ -2,6 +2,7 @@
 # kernel was released at the end of 2020.
 
 [metadata]
+nrext64=0
 bigtime=0
 crc=1
 finobt=1
index 320829584977a0edd2f139afb4aa690aed5a837a..d751f4c4667a8e8420636b24dbc8a40f29879c08 100644 (file)
@@ -2,6 +2,7 @@
 # kernel was released at the end of 2021.
 
 [metadata]
+nrext64=0
 bigtime=1
 crc=1
 finobt=1
index dd60b9f1583a4fc73036d86cb2d8d1d7e97f0c12..7e8a0ff0780324eb4b4a0a48f2f3d6cce5ab689c 100644 (file)
@@ -2,6 +2,7 @@
 # kernel was released at the end of 2019.
 
 [metadata]
+nrext64=0
 bigtime=0
 crc=1
 finobt=1
index 21cb81f1457594633295bf053ac8213b2a5791b0..a4705ee454a36542765ded2b7ede4d1b17b74aa8 100644 (file)
@@ -87,6 +87,7 @@ enum {
        I_ATTR,
        I_PROJID32BIT,
        I_SPINODES,
+       I_NREXT64,
        I_MAX_OPTS,
 };
 
@@ -441,6 +442,7 @@ static struct opt_params iopts = {
                [I_ATTR] = "attr",
                [I_PROJID32BIT] = "projid32bit",
                [I_SPINODES] = "sparse",
+               [I_NREXT64] = "nrext64",
        },
        .subopt_params = {
                { .index = I_ALIGN,
@@ -489,6 +491,12 @@ static struct opt_params iopts = {
                  .maxval = 1,
                  .defaultval = 1,
                },
+               { .index = I_NREXT64,
+                 .conflicts = { { NULL, LAST_CONFLICT } },
+                 .minval = 0,
+                 .maxval = 1,
+                 .defaultval = 1,
+               }
        },
 };
 
@@ -813,6 +821,7 @@ struct sb_feat_args {
        bool    bigtime;                /* XFS_SB_FEAT_INCOMPAT_BIGTIME */
        bool    nodalign;
        bool    nortalign;
+       bool    nrext64;
 };
 
 struct cli_params {
@@ -1603,6 +1612,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;
        }
@@ -2181,6 +2193,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) {
@@ -3173,6 +3193,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;
 }
 
 /*
@@ -3938,6 +3960,7 @@ main(
                        .nodalign = false,
                        .nortalign = false,
                        .bigtime = true,
+                       .nrext64 = false,
                        /*
                         * When we decide to enable a new feature by default,
                         * please remember to update the mkfs conf files.