]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
mkfs: enable formatting with parent pointers
authorAllison Henderson <allison.henderson@oracle.com>
Tue, 9 Jan 2024 17:39:26 +0000 (09:39 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 10 Apr 2024 00:21:31 +0000 (17:21 -0700)
Enable parent pointer support in mkfs via the '-n parent' parameter.

Signed-off-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
[djwong: move the no-V4 filesystem check to join the rest]
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
mkfs/xfs_mkfs.c

index 9bfd582b27546ab1c280d03fc65d08c7d69d88b8..ee32643655fbb23df2fa34de0d6531b4464715f1 100644 (file)
@@ -114,6 +114,7 @@ enum {
        N_SIZE = 0,
        N_VERSION,
        N_FTYPE,
+       N_PARENT,
        N_MAX_OPTS,
 };
 
@@ -656,6 +657,7 @@ static struct opt_params nopts = {
                [N_SIZE] = "size",
                [N_VERSION] = "version",
                [N_FTYPE] = "ftype",
+               [N_PARENT] = "parent",
                [N_MAX_OPTS] = NULL,
        },
        .subopt_params = {
@@ -679,6 +681,14 @@ static struct opt_params nopts = {
                  .maxval = 1,
                  .defaultval = 1,
                },
+               { .index = N_PARENT,
+                 .conflicts = { { NULL, LAST_CONFLICT } },
+                 .minval = 0,
+                 .maxval = 1,
+                 .defaultval = 1,
+               },
+
+
        },
 };
 
@@ -1040,7 +1050,7 @@ usage( void )
                            sunit=value|su=num,sectsize=num,lazy-count=0|1,\n\
                            concurrency=num]\n\
 /* label */            [-L label (maximum 12 characters)]\n\
-/* naming */           [-n size=num,version=2|ci,ftype=0|1]\n\
+/* naming */           [-n size=num,version=2|ci,ftype=0|1,parent=0|1]]\n\
 /* no-op info only */  [-N]\n\
 /* prototype file */   [-p fname]\n\
 /* quiet */            [-q]\n\
@@ -1878,6 +1888,9 @@ naming_opts_parser(
        case N_FTYPE:
                cli->sb_feat.dirftype = getnum(value, opts, subopt);
                break;
+       case N_PARENT:
+               cli->sb_feat.parent_pointers = getnum(value, &nopts, N_PARENT);
+               break;
        default:
                return -EINVAL;
        }
@@ -2385,6 +2398,14 @@ _("exchange-range not supported without CRC support\n"));
                        usage();
                }
                cli->sb_feat.exchrange = false;
+
+               if (cli->sb_feat.parent_pointers &&
+                   cli_opt_set(&nopts, N_PARENT)) {
+                       fprintf(stderr,
+_("parent pointers not supported without CRC support\n"));
+                       usage();
+               }
+               cli->sb_feat.parent_pointers = false;
        }
 
        if (!cli->sb_feat.finobt) {
@@ -3458,8 +3479,6 @@ sb_set_features(
                sbp->sb_features2 |= XFS_SB_VERSION2_LAZYSBCOUNTBIT;
        if (fp->projid32bit)
                sbp->sb_features2 |= XFS_SB_VERSION2_PROJID32BIT;
-       if (fp->parent_pointers)
-               sbp->sb_features2 |= XFS_SB_VERSION2_PARENTBIT;
        if (fp->crcs_enabled)
                sbp->sb_features2 |= XFS_SB_VERSION2_CRCBIT;
        if (fp->attr_version == 2)
@@ -3500,6 +3519,10 @@ sb_set_features(
                sbp->sb_features_ro_compat |= XFS_SB_FEAT_RO_COMPAT_INOBTCNT;
        if (fp->bigtime)
                sbp->sb_features_incompat |= XFS_SB_FEAT_INCOMPAT_BIGTIME;
+       if (fp->parent_pointers) {
+               sbp->sb_features_incompat |= XFS_SB_FEAT_INCOMPAT_PARENT;
+               sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT;
+       }
 
        /*
         * Sparse inode chunk support has two main inode alignment requirements.