@@ -110,6 +110,7 @@ enum {
N_SIZE = 0,
N_VERSION,
N_FTYPE,
+ N_PARENT,
N_MAX_OPTS,
};
@@ -615,6 +616,7 @@ static struct opt_params nopts = {
[N_SIZE] = "size",
[N_VERSION] = "version",
[N_FTYPE] = "ftype",
+ [N_PARENT] = "parent",
[N_MAX_OPTS] = NULL,
},
.subopt_params = {
@@ -638,6 +640,14 @@ static struct opt_params nopts = {
.maxval = 1,
.defaultval = 1,
},
+ { .index = N_PARENT,
+ .conflicts = { { NULL, LAST_CONFLICT } },
+ .minval = 0,
+ .maxval = 1,
+ .defaultval = 1,
+ },
+
+
},
};
@@ -970,7 +980,7 @@ usage( void )
/* log subvol */ [-l agnum=n,internal,size=num,logdev=xxx,version=n\n\
sunit=value|su=num,sectsize=num,lazy-count=0|1]\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\
@@ -1744,6 +1754,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;
}
@@ -2225,6 +2238,14 @@ _("inode btree counters not supported without finobt support\n"));
cli->sb_feat.inobtcnt = false;
}
+ if ((cli->sb_feat.parent_pointers) &&
+ cli->sb_feat.dir_version == 4) {
+ fprintf(stderr,
+_("parent pointers not supported on v4 filesystems\n"));
+ usage();
+ cli->sb_feat.parent_pointers = false;
+ }
+
if (cli->xi->rtname) {
if (cli->sb_feat.reflink && cli_opt_set(&mopts, M_REFLINK)) {
fprintf(stderr,
@@ -3224,8 +3245,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)
@@ -3266,6 +3285,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.