xfs
[Top] [All Lists]

[PATCH 3/3] xfsprog: add mkfs.xfs sb v4 support for dirent filetype fiel

To: xfs@xxxxxxxxxxx
Subject: [PATCH 3/3] xfsprog: add mkfs.xfs sb v4 support for dirent filetype field
From: Mark Tinguely <tinguely@xxxxxxx>
Date: Thu, 19 Sep 2013 16:05:26 -0500
Delivered-to: xfs@xxxxxxxxxxx
References: <20130919211523.407741285@xxxxxxx>
User-agent: quilt/0.51-1
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 */


<Prev in Thread] Current Thread [Next in Thread>