Add mkfs.xfs entry that enables the filetype field in the directory
feature bit.
In sb v4, "mkfs.xfs -n ftype=1 DEVICE" turns on the feature.
The feature is automatically turned on for sb v5 like it was
in the original patch.
Signed-off-by: Mark Tinguely <tinguely@xxxxxxx>
---
man/man8/mkfs.xfs.8 | 7 +++++++
mkfs/xfs_mkfs.c | 40 +++++++++++++++++++++++++++-------------
mkfs/xfs_mkfs.h | 4 +++-
3 files changed, 37 insertions(+), 14 deletions(-)
Index: b/man/man8/mkfs.xfs.8
===================================================================
--- a/man/man8/mkfs.xfs.8
+++ b/man/man8/mkfs.xfs.8
@@ -517,6 +517,13 @@ option enables ASCII only case-insensiti
are stored in directories using the case they were created with.
.IP
Note: Version 1 directories are not supported.
+.TP
+.BI ftype= value
+The inode type is stored in the directory
+.I value
+can be either 0 or 1.
+With 0 meaning not supported (default) and 1 meaning supported.
+.IP
.RE
.TP
.BI \-p " protofile"
Index: b/mkfs/xfs_mkfs.c
===================================================================
--- a/mkfs/xfs_mkfs.c
+++ b/mkfs/xfs_mkfs.c
@@ -147,6 +147,8 @@ char *nopts[] = {
"size",
#define N_VERSION 2
"version",
+#define N_FTYPE 3
+ "ftype",
NULL,
};
@@ -885,6 +887,7 @@ main(
char *dfile;
int dirblocklog;
int dirblocksize;
+ int dirftype;
int dirversion;
char *dsize;
int dsu;
@@ -931,6 +934,7 @@ main(
int nodsflag;
int norsflag;
xfs_alloc_rec_t *nrec;
+ int niflag;
int nsflag;
int nvflag;
int nci;
@@ -977,8 +981,8 @@ main(
loginternal = 1;
logversion = 2;
logagno = logblocks = rtblocks = rtextblocks = 0;
- Nflag = nlflag = nsflag = nvflag = nci = 0;
- dirblocklog = dirblocksize = 0;
+ Nflag = niflag = nlflag = nsflag = nvflag = nci = 0;
+ dirftype = dirblocklog = dirblocksize = 0;
dirversion = XFS_DFL_DIR_VERSION;
qflag = 0;
imaxpct = inodelog = inopblock = isize = 0;
@@ -1534,6 +1538,14 @@ main(
}
nvflag = 1;
break;
+ case N_FTYPE:
+ if (!value || *value == '\0')
+ reqval('n', nopts, N_FTYPE);
+ if (niflag)
+ respec('n', nopts, N_FTYPE);
+ dirftype = atoi(value);
+ niflag = 1;
+ break;
default:
unknown('n', value);
}
@@ -2433,7 +2445,7 @@ _("size %s specified for log subvolume i
" =%-22s crc=%u\n"
"data =%-22s bsize=%-6u blocks=%llu, imaxpct=%u\n"
" =%-22s sunit=%-6u swidth=%u blks\n"
- "naming =version %-14u bsize=%-6u ascii-ci=%d\n"
+ "naming =version %-14u bsize=%-6u ascii-ci=%d ftype=%d\n"
"log =%-22s bsize=%-6d blocks=%lld, version=%d\n"
" =%-22s sectsz=%-5u sunit=%d blks, lazy-count=%d\n"
"realtime =%-22s extsz=%-6d blocks=%lld, rtextents=%lld\n"),
@@ -2442,7 +2454,7 @@ _("size %s specified for log subvolume i
"", crcs_enabled,
"", blocksize, (long long)dblocks, imaxpct,
"", dsunit, dswidth,
- dirversion, dirblocksize, nci,
+ dirversion, dirblocksize, nci, dirftype,
logfile, 1 << blocklog, (long long)logblocks,
logversion, "", lsectorsize, lsunit, lazy_sb_counters,
rtfile, rtextblocks << blocklog,
@@ -2504,21 +2516,23 @@ _("size %s specified for log subvolume i
sbp->sb_logsectlog = 0;
sbp->sb_logsectsize = 0;
}
- sbp->sb_features2 = XFS_SB_VERSION2_MKFS(crcs_enabled, lazy_sb_counters,
- attrversion == 2, !projid16bit, 0);
- sbp->sb_versionnum = XFS_SB_VERSION_MKFS(crcs_enabled, iaflag,
- dsunit != 0,
- logversion == 2, attrversion == 1,
- (sectorsize != BBSIZE ||
- lsectorsize != BBSIZE),
- nci, sbp->sb_features2 != 0);
+
/*
* dirent filetype field always enabled on v5 superblocks
*/
if (crcs_enabled) {
sbp->sb_features_incompat = XFS_SB_FEAT_INCOMPAT_FTYPE;
+ dirftype = 1;
}
+ sbp->sb_features2 = XFS_SB_VERSION2_MKFS(crcs_enabled, lazy_sb_counters,
+ attrversion == 2, !projid16bit, 0, dirftype);
+ sbp->sb_versionnum = XFS_SB_VERSION_MKFS(crcs_enabled, iaflag,
+ dsunit != 0,
+ logversion == 2, attrversion == 1,
+ (sectorsize != BBSIZE ||
+ lsectorsize != BBSIZE),
+ nci, sbp->sb_features2 != 0);
/*
* Due to a structure alignment issue, sb_features2 ended up in one
* of two locations, the second "incorrect" location represented by
@@ -3057,7 +3071,7 @@ usage( void )
sunit=value|su=num,sectlog=n|sectsize=num,\n\
lazy-count=0|1]\n\
/* label */ [-L label (maximum 12 characters)]\n\
-/* naming */ [-n log=n|size=num,version=2|ci]\n\
+/* naming */ [-n log=n|size=num,version=2|ci,ftype=0|1]\n\
/* no-op info only */ [-N]\n\
/* prototype file */ [-p fname]\n\
/* quiet */ [-q]\n\
Index: b/mkfs/xfs_mkfs.h
===================================================================
--- a/mkfs/xfs_mkfs.h
+++ b/mkfs/xfs_mkfs.h
@@ -36,12 +36,14 @@
XFS_DFL_SB_VERSION_BITS | \
0 ) : XFS_SB_VERSION_1 )
-#define XFS_SB_VERSION2_MKFS(crc, lazycount, attr2, projid32bit, parent) (\
+#define XFS_SB_VERSION2_MKFS(crc, lazycount, attr2, projid32bit, parent, \
+ ftype) (\
((lazycount) ? XFS_SB_VERSION2_LAZYSBCOUNTBIT : 0) | \
((attr2) ? XFS_SB_VERSION2_ATTR2BIT : 0) | \
((projid32bit) ? XFS_SB_VERSION2_PROJID32BIT : 0) | \
((parent) ? XFS_SB_VERSION2_PARENTBIT : 0) | \
((crc) ? XFS_SB_VERSION2_CRCBIT : 0) | \
+ ((ftype) ? XFS_SB_VERSION2_FTYPE : 0) | \
0 )
#define XFS_DFL_BLOCKSIZE_LOG 12 /* 4096 byte blocks */
|