On Wed, Dec 07, 2016 at 02:27:15PM +0100, Jan Tulak wrote: > Fill the table with conflicts data and remove now-duplicate code for their > detection from other parts of mkfs. > > Signed-off-by: Jan Tulak <jtulak@xxxxxxxxxx> Reviewed-by: Bill O'Donnell <billodo@xxxxxxxxxx> > --- > mkfs/xfs_mkfs.c | 152 ++++++++++++++++++++++++++------------------------------ > 1 file changed, 70 insertions(+), 82 deletions(-) > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 2122d1c..30618ff 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -45,7 +45,7 @@ unsigned int sectorsize; > #define MAX_OPTS 16 > #define MAX_SUBOPTS 16 > #define SUBOPT_NEEDS_VAL (-1LL) > -#define MAX_CONFLICTS 8 > +#define MAX_CONFLICTS 32 > #define LAST_CONFLICT (-1) > > #define OPT_B 0 > @@ -409,7 +409,9 @@ struct opt_params { > }, > .subopt_params = { > { .index = I_ALIGN, > - .conflicts = { {LAST_CONFLICT} }, > + .conflicts = { {OPT_M, M_CRC, true, 1, 0, > + "Inodes always aligned for CRC enabled filesytems."}, > + {LAST_CONFLICT} }, > .minval = 0, > .maxval = 1, > .defaultval = 1, > @@ -447,19 +449,26 @@ struct opt_params { > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = I_ATTR, > - .conflicts = { {LAST_CONFLICT} }, > + .conflicts = { {OPT_M, M_CRC, true, 1, 1, > + "V2 attribute format always enabled on CRC enabled filesytems."}, > + {LAST_CONFLICT} }, > .minval = 0, > .maxval = 2, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = I_PROJID32BIT, > - .conflicts = { {LAST_CONFLICT} }, > + .conflicts = { {OPT_M, M_CRC, true, 1, 0, > + "32 bit Project IDs always enabled on CRC enabled filesytems."}, > + {LAST_CONFLICT} }, > + > .minval = 0, > .maxval = 1, > .defaultval = 1, > }, > { .index = I_SPINODES, > - .conflicts = { {LAST_CONFLICT} }, > + .conflicts = { {OPT_M, M_CRC, true, 0, 1, > + "Sparse inodes not supported without CRC support."}, > + {LAST_CONFLICT} }, > .minval = 0, > .maxval = 1, > .defaultval = 1, > @@ -508,7 +517,9 @@ struct opt_params { > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = L_VERSION, > - .conflicts = { {LAST_CONFLICT} }, > + .conflicts = { {OPT_M, M_CRC, true, 1, 1, > + "V2 logs are required for CRC enabled filesystems."}, > + {LAST_CONFLICT} }, > .minval = 1, > .maxval = 2, > .defaultval = SUBOPT_NEEDS_VAL, > @@ -564,7 +575,9 @@ struct opt_params { > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = L_LAZYSBCNTR, > - .conflicts = { {LAST_CONFLICT} }, > + .conflicts = { {OPT_M, M_CRC, true, 1, 0, > + "Lazy superblock counted always enabled for CRC enabled filesytems."}, > + {LAST_CONFLICT} }, > .minval = 0, > .maxval = 1, > .defaultval = 1, > @@ -605,7 +618,9 @@ struct opt_params { > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = N_FTYPE, > - .conflicts = { {LAST_CONFLICT} }, > + .conflicts = { {OPT_M, M_CRC, true, 1, 0, > + "Cannot disable ftype with crcs enabled."}, > + {LAST_CONFLICT} }, > .minval = 0, > .maxval = 1, > .defaultval = 1, > @@ -640,7 +655,9 @@ struct opt_params { > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = R_DEV, > - .conflicts = { {LAST_CONFLICT} }, > + .conflicts = { {OPT_M, M_RMAPBT, false, 0, 0, > + "rmapbt not supported without CRC support."}, > + {LAST_CONFLICT} }, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = R_FILE, > @@ -650,7 +667,9 @@ struct opt_params { > .conflicts = { {LAST_CONFLICT} }, > }, > { .index = R_NAME, > - .conflicts = { {LAST_CONFLICT} }, > + .conflicts = { {OPT_M, M_RMAPBT, false, 0, 0, > + "rmapbt not supported without CRC support."}, > + {LAST_CONFLICT} }, > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = R_NOALIGN, > @@ -723,13 +742,35 @@ struct opt_params { > }, > .subopt_params = { > { .index = M_CRC, > - .conflicts = { {LAST_CONFLICT} }, > + .conflicts = { {OPT_L, L_VERSION, true, 1, 1, > + "V2 logs are required for CRC enabled filesystems."}, > + {OPT_I, I_ALIGN, true, 0, 1, > + "Inodes always aligned for CRC enabled filesytems."}, > + {OPT_I, I_PROJID32BIT, true, 0, 1, > + "32 bit Project IDs always enabled on CRC enabled filesytems."}, > + {OPT_I, I_ATTR, true, 1, 1, > + "V2 attribute format always enabled on CRC enabled filesytems."}, > + {OPT_L, L_LAZYSBCNTR, true, 0, 1, > + "Lazy superblock counted always enabled for CRC enabled filesytems."}, > + {OPT_M, M_FINOBT, true, 1, 0, > + "Finobt not supported without CRC support."}, > + {OPT_M, M_RMAPBT, true, 1, 0, > + "rmapbt not supported without CRC support."}, > + {OPT_M, M_REFLINK, true, 1, 0, > + "reflink not supported without CRC support."}, > + {OPT_I, I_SPINODES, true, 1, 0, > + "Sparse inodes not supported without CRC support."}, > + {OPT_N, N_FTYPE, true, 0, 1, > + "Cannot disable ftype with crcs enabled."}, > + {LAST_CONFLICT} }, > .minval = 0, > .maxval = 1, > .defaultval = 1, > }, > { .index = M_FINOBT, > - .conflicts = { {LAST_CONFLICT} }, > + .conflicts = { {OPT_M, M_CRC, true, 0, 1, > + "Finobt not supported without CRC support\n"}, > + {LAST_CONFLICT} }, > .minval = 0, > .maxval = 1, > .defaultval = 1, > @@ -739,13 +780,21 @@ struct opt_params { > .defaultval = SUBOPT_NEEDS_VAL, > }, > { .index = M_RMAPBT, > - .conflicts = { {LAST_CONFLICT} }, > + .conflicts = { {OPT_M, M_CRC, true, 0, 1, > + "rmapbt not supported without CRC support."}, > + {OPT_R, R_NAME, false, 0, 0, > + "rmapbt not supported with realtime devices."}, > + {OPT_R, R_DEV, false, 0, 0, > + "rmapbt not supported with realtime devices."}, > + {LAST_CONFLICT} }, > .minval = 0, > .maxval = 1, > .defaultval = 0, > }, > { .index = M_REFLINK, > - .conflicts = { {LAST_CONFLICT} }, > + .conflicts = { {OPT_M, M_CRC, true, 0, 1, > + "reflink not supported without CRC support."}, > + {LAST_CONFLICT} }, > .minval = 0, > .maxval = 1, > .defaultval = 0, > @@ -2183,11 +2232,16 @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n"), > XFS_MIN_CRC_BLOCKSIZE); > usage(); > } > + > + /* > + * If user explicitly stated -m crc=1 -n ftype=0, an error was already > + * issued. But if -n ftype=0 was stated alone, then it is a conflict > + * with a default value for crc enabled and has to be detected here. > + */ > if (sb_feat.crcs_enabled && !sb_feat.dirftype) { > fprintf(stderr, _("cannot disable ftype with crcs enabled\n")); > usage(); > } > - > if (!slflag && !ssflag) { > sectorlog = XFS_MIN_SECTORSIZE_LOG; > sectorsize = XFS_MIN_SECTORSIZE; > @@ -2293,42 +2347,6 @@ _("Minimum inode size for CRCs is %d bytes\n"), > 1 << XFS_DINODE_DFL_CRC_LOG); > usage(); > } > - > - /* inodes always aligned */ > - if (!sb_feat.inode_align) { > - fprintf(stderr, > -_("Inodes always aligned for CRC enabled filesytems\n")); > - usage(); > - } > - > - /* lazy sb counters always on */ > - if (!sb_feat.lazy_sb_counters) { > - fprintf(stderr, > -_("Lazy superblock counted always enabled for CRC enabled filesytems\n")); > - usage(); > - } > - > - /* version 2 logs always on */ > - if (sb_feat.log_version != 2) { > - fprintf(stderr, > -_("V2 logs always enabled for CRC enabled filesytems\n")); > - usage(); > - } > - > - /* attr2 always on */ > - if (sb_feat.attr_version != 2) { > - fprintf(stderr, > -_("V2 attribute format always enabled on CRC enabled filesytems\n")); > - usage(); > - } > - > - /* 32 bit project quota always on */ > - /* attr2 always on */ > - if (sb_feat.projid16bit) { > - fprintf(stderr, > -_("32 bit Project IDs always enabled on CRC enabled filesytems\n")); > - usage(); > - } > } else { > /* > * The kernel doesn't currently support crc=0,finobt=1 > @@ -2336,46 +2354,16 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); > * explicitly turned finobt on, then silently turn it off to > * avoid an unnecessary warning. > * If the user explicitly tried to use crc=0,finobt=1, > - * then issue an error. > + * the error was already issued during args parsing. > * The same is also for sparse inodes. > */ > - if (sb_feat.finobt && opts[OPT_M].subopt_params[M_FINOBT].seen) { > - fprintf(stderr, > -_("finobt not supported without CRC support\n")); > - usage(); > - } > sb_feat.finobt = 0; > - > - if (sb_feat.spinodes) { > - fprintf(stderr, > -_("sparse inodes not supported without CRC support\n")); > - usage(); > - } > sb_feat.spinodes = 0; > > - if (sb_feat.rmapbt) { > - fprintf(stderr, > -_("rmapbt not supported without CRC support\n")); > - usage(); > - } > sb_feat.rmapbt = false; > - > - if (sb_feat.reflink) { > - fprintf(stderr, > -_("reflink not supported without CRC support\n")); > - usage(); > - } > sb_feat.reflink = false; > } > > - > - if (sb_feat.rmapbt && xi.rtname) { > - fprintf(stderr, > -_("rmapbt not supported with realtime devices\n")); > - usage(); > - sb_feat.rmapbt = false; > - } > - > if (nsflag || nlflag) { > if (dirblocksize < blocksize || > dirblocksize > XFS_MAX_BLOCKSIZE) { > -- > 2.8.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html