Add directory inode type feature to mkfs.xfs. In sb v4, "-n ftype=1" turns on the feature. The feature is still automatically turned on for sb v5. Signed-off-by: Mark Tinguely <tinguely@xxxxxxx> --- man/man8/mkfs.xfs.8 | 7 +++++++ man/man8/mkfs.xfs.8 | 10 ++++++++++ mkfs/xfs_mkfs.c | 40 +++++++++++++++++++++++++++------------- mkfs/xfs_mkfs.h | 4 +++- 3 files changed, 40 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,16 @@ 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 +Version 4 superblock supports the inode type stored in the directory feature. +.I value +can be either 0 or 1. +With 0 meaning not supported (default) and 1 meaning supported. +.IP +Version 5 superblocks automatically support this feature and this +setting will be ignored. +.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; @@ -930,6 +933,7 @@ main( int nodsflag; int norsflag; xfs_alloc_rec_t *nrec; + int niflag; int nsflag; int nvflag; int nci; @@ -976,8 +980,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; @@ -1533,6 +1537,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); } @@ -2434,6 +2446,14 @@ _("size %s specified for log subvolume i } validate_log_size(logblocks, blocklog, min_logblocks); + /* + * dirent filetype field always enabled on v5 superblocks + */ + if (crcs_enabled) { + sbp->sb_features_incompat = XFS_SB_FEAT_INCOMPAT_FTYPE; + dirftype = 1; + } + if (!qflag || Nflag) { printf(_( "meta-data=%-22s isize=%-6d agcount=%lld, agsize=%lld blks\n" @@ -2441,7 +2461,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"), @@ -2450,7 +2470,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, @@ -2512,8 +2532,9 @@ _("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); + attrversion == 2, !projid16bit, 0, dirftype); sbp->sb_versionnum = XFS_SB_VERSION_MKFS(crcs_enabled, iaflag, dsunit != 0, logversion == 2, attrversion == 1, @@ -2521,13 +2542,6 @@ _("size %s specified for log subvolume i 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; - } - - /* * Due to a structure alignment issue, sb_features2 ended up in one * of two locations, the second "incorrect" location represented by * the sb_bad_features2 field. To avoid older kernels mounting @@ -3065,7 +3079,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 */ _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs