From: Eric Sandeen Date: Tue, 18 Aug 2015 07:53:17 +0000 (+1000) Subject: mkfs.xfs: fix ftype-vs-crc option combination testing X-Git-Tag: v4.2.0-rc2~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b990de8ba4e2df2bc76a140799d3ddb4a0eac4ce;p=thirdparty%2Fxfsprogs-dev.git mkfs.xfs: fix ftype-vs-crc option combination testing mkfs.xfs got weird along the way; today it has different outcomes depending on the order of option specification: $ mkfs/mkfs.xfs -n ftype=1 -m crc=0 -dfile,name=fsfile,size=16g cannot specify both crc and ftype $ mkfs/mkfs.xfs -m crc=0 -n ftype=1 -dfile,name=fsfile,size=16g Somehow the tests got written as being constrained on what options are specified - and in what order! - vs actually testing for incompatible feature sets. It's fine to specify both crc & ftype options, as long as it's an allowed combination, so just test for the incompatible combination (crc=1 and ftype=0) after all options have been processed. [dchinner: fix dirftype init value so mkfs default config works] Signed-off-by: Eric Sandeen Reviewed-by: Brian Foster Signed-off-by: Dave Chinner --- diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 69d61c7da..d993fc04b 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -966,7 +966,8 @@ main( logversion = 2; logagno = logblocks = rtblocks = rtextblocks = 0; Nflag = nlflag = nsflag = nvflag = nci = 0; - nftype = dirftype = 0; /* inode type information in the dir */ + dirftype = 1; /* inode type information in the dir */ + nftype = 0; dirblocklog = dirblocksize = 0; dirversion = XFS_DFL_DIR_VERSION; qflag = 0; @@ -1477,11 +1478,6 @@ main( if (c < 0 || c > 1) illegal(value, "m crc"); crcs_enabled = c; - if (nftype && crcs_enabled) { - fprintf(stderr, -_("cannot specify both crc and ftype\n")); - usage(); - } break; case M_FINOBT: if (!value || *value == '\0') @@ -1555,11 +1551,6 @@ _("cannot specify both crc and ftype\n")); if (nftype) respec('n', nopts, N_FTYPE); dirftype = atoi(value); - if (crcs_enabled) { - fprintf(stderr, -_("cannot specify both crc and ftype\n")); - usage(); - } nftype = 1; break; default: @@ -1714,6 +1705,10 @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n"), XFS_MIN_CRC_BLOCKSIZE); usage(); } + if (crcs_enabled && !dirftype) { + fprintf(stderr, _("cannot disable ftype with crcs enabled\n")); + usage(); + } memset(&ft, 0, sizeof(ft)); get_topology(&xi, &ft, force_overwrite);