From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-vk0-f53.google.com ([209.85.213.53]:34682 "EHLO mail-vk0-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751718AbdC2O54 (ORCPT ); Wed, 29 Mar 2017 10:57:56 -0400 Received: by mail-vk0-f53.google.com with SMTP id z204so20742616vkd.1 for ; Wed, 29 Mar 2017 07:57:54 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: <40f76322-d4f1-5c48-3568-206a2564dad5@sandeen.net> References: <20170315160017.27805-1-jtulak@redhat.com> <20170315160017.27805-12-jtulak@redhat.com> <40f76322-d4f1-5c48-3568-206a2564dad5@sandeen.net> From: Jan Tulak Date: Wed, 29 Mar 2017 16:57:33 +0200 Message-ID: Subject: Re: [PATCH 11/22] mkfs: add test_default_value into conflict struct Content-Type: text/plain; charset=UTF-8 Sender: linux-xfs-owner@vger.kernel.org List-ID: List-Id: xfs To: Eric Sandeen Cc: linux-xfs@vger.kernel.org On Sat, Mar 25, 2017 at 1:09 AM, Eric Sandeen wrote: > On 3/15/17 11:00 AM, Jan Tulak wrote: >> Add a flag signalising that a subopt can be conflicting with >> default value of another option. > > I'm a little confused about why we would not /always/ test against > the default value. When is it ever appropriate to ignore it? Just a quick search: if the user disables crc, but doesn't touch finobt, we are making a silent sb_feat.finobt=0. So we can't raise a conflict with default value, but it is a conflict if it is an explicit value. And maybe there are other similar cases tangled in the forest of ifs in main(). > > I was also going to suggest flags rather than the two booleans, > i.e. something like "CONFLICT_OPTION_ALWAYS" or "CONFLICT_OPTION_AT_VALUE" > vs. the true, false / true, true / false, false ... etc, > but I guess the next patch that adds named initializers might > help a little in that respect. Still, flags named like this > might be clearer in the code... Using a bit flag instead? Mmm, that might help with readability. Maybe. Not just these two options, but others as well: .flags = CONFLICT_OPTION_ALWAYS | NEEDS_VAL | IS_POWER_2 etc... > > Also, I am confused by: > > "The .test_default_value is used when .test_values is true" > > and yet I see: > >> { .index = R_DEV, >> - .conflicts = { {OPT_M, M_RMAPBT, false, 0, 0, >> + .conflicts = { {OPT_M, M_RMAPBT, false, true, 0, 0, >> "rmapbt not supported without CRC support."}, > > so it is also used when it is false? So we do not test the values > specified, but we do test the default values? that seems odd, is > it correct? I'm not sure what this means. The unique combination of > "false, true" actually only occurs 5 times. Eh... this seems to be an error, it should be false, false. The true makes no sense there - the conflict checks never gets to the true if the first one is false, and a quick test with xfs/191-input-validation confirms this: no difference between false, true and false, false, but true, true causes multiple errors. > > There also seems to be a mismatch between the M_CRC -> I_ALIGN conflict, > vs. the I_ALIGN -> M_CRC conflict. Yes, this shouldn't bee so. > > ... and that highlights one of my concerns about this patchset - while it is at > least moving towards encoding every conflict into this (giant) structure, > it also seems a bit error prone. The opt_params structure is now nearly > 1000 lines of code. I'm not quite sure how to make this more maintainable, > but it seems difficult right now... > Yeah, it has grown fairly long. However, a lot of those errors I have here is caused by the fact that I moved a lot of the options at once and probably sometimes looked on some other line than I should, or copy&paste thing. Later, when they are added/changed once in a long time, it should be more reliable. And I'm adding a validating function to spot this kind of errors before the program does anything else. Thanks, Jan > Thanks, > -Eric > >> Signed-off-by: Jan Tulak >> --- >> mkfs/xfs_mkfs.c | 156 +++++++++++++++++++++++++++++--------------------------- >> 1 file changed, 80 insertions(+), 76 deletions(-) >> >> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c >> index db82a528..19024847 100644 >> --- a/mkfs/xfs_mkfs.c >> +++ b/mkfs/xfs_mkfs.c >> @@ -172,6 +172,8 @@ unsigned int sectorsize; >> * on the CLI, no matter its value. The field .message contains an optional >> * explanatory string for the user. This string can't be translated here, >> * so it has to be enveloped with _() when printed. >> + * The .test_default_value is used when .test_values is true, and extends >> + * the check also for default values. >> * The last member of this list has to be {LAST_CONFLICT}. >> * >> * minval, maxval OPTIONAL >> @@ -214,6 +216,7 @@ struct opt_params { >> int opt; >> int subopt; >> bool test_values; >> + bool test_default_value; >> long long invalid_value; >> long long at_value; >> const char *message; >> @@ -234,7 +237,7 @@ struct opt_params { >> }, >> .subopt_params = { >> { .index = B_LOG, >> - .conflicts = { {OPT_B, B_SIZE, false, 0, 0}, >> + .conflicts = { {OPT_B, B_SIZE, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .minval = XFS_MIN_BLOCKSIZE_LOG, >> .maxval = XFS_MAX_BLOCKSIZE_LOG, >> @@ -243,7 +246,7 @@ struct opt_params { >> { .index = B_SIZE, >> .convert = true, >> .is_power_2 = true, >> - .conflicts = { {OPT_B, B_LOG, false, 0, 0}, >> + .conflicts = { {OPT_B, B_LOG, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .minval = XFS_MIN_BLOCKSIZE, >> .maxval = XFS_MAX_BLOCKSIZE, >> @@ -274,7 +277,7 @@ struct opt_params { >> }, >> .subopt_params = { >> { .index = D_AGCOUNT, >> - .conflicts = { {OPT_D, D_AGSIZE, false, 0, 0}, >> + .conflicts = { {OPT_D, D_AGSIZE, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .minval = 1, >> .maxval = XFS_MAX_AGNUMBER, >> @@ -298,25 +301,25 @@ struct opt_params { >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = D_SUNIT, >> - .conflicts = { {OPT_D, D_NOALIGN, false, 0, 0}, >> - {OPT_D, D_SU, false, 0, 0}, >> - {OPT_D, D_SW, false, 0, 0}, >> + .conflicts = { {OPT_D, D_NOALIGN, false, false, 0, 0}, >> + {OPT_D, D_SU, false, false, 0, 0}, >> + {OPT_D, D_SW, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .minval = 0, >> .maxval = UINT_MAX, >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = D_SWIDTH, >> - .conflicts = { {OPT_D, D_NOALIGN, false, 0, 0}, >> - {OPT_D, D_SU, false, 0, 0}, >> - {OPT_D, D_SW, false, 0, 0}, >> + .conflicts = { {OPT_D, D_NOALIGN, false, false, 0, 0}, >> + {OPT_D, D_SU, false, false, 0, 0}, >> + {OPT_D, D_SW, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .minval = 0, >> .maxval = UINT_MAX, >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = D_AGSIZE, >> - .conflicts = { {OPT_D, D_AGCOUNT, false, 0, 0}, >> + .conflicts = { {OPT_D, D_AGCOUNT, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .convert = true, >> .minval = XFS_AG_MIN_BYTES, >> @@ -324,9 +327,9 @@ struct opt_params { >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = D_SU, >> - .conflicts = { {OPT_D, D_NOALIGN, false, 0, 0}, >> - {OPT_D, D_SUNIT, false, 0, 0}, >> - {OPT_D, D_SWIDTH, false, 0, 0}, >> + .conflicts = { {OPT_D, D_NOALIGN, false, false, 0, 0}, >> + {OPT_D, D_SUNIT, false, false, 0, 0}, >> + {OPT_D, D_SWIDTH, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .convert = true, >> .minval = 0, >> @@ -334,23 +337,23 @@ struct opt_params { >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = D_SW, >> - .conflicts = { {OPT_D, D_NOALIGN, false, 0, 0}, >> - {OPT_D, D_SUNIT, false, 0, 0}, >> - {OPT_D, D_SWIDTH, false, 0, 0}, >> + .conflicts = { {OPT_D, D_NOALIGN, false, false, 0, 0}, >> + {OPT_D, D_SUNIT, false, false, 0, 0}, >> + {OPT_D, D_SWIDTH, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .minval = 0, >> .maxval = UINT_MAX, >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = D_SECTLOG, >> - .conflicts = { {OPT_D, D_SECTSIZE, false, 0, 0}, >> + .conflicts = { {OPT_D, D_SECTSIZE, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .minval = XFS_MIN_SECTORSIZE_LOG, >> .maxval = XFS_MAX_SECTORSIZE_LOG, >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = D_SECTSIZE, >> - .conflicts = { {OPT_D, D_SECTLOG, false, 0, 0}, >> + .conflicts = { {OPT_D, D_SECTLOG, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .convert = true, >> .is_power_2 = true, >> @@ -359,10 +362,10 @@ struct opt_params { >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = D_NOALIGN, >> - .conflicts = { {OPT_D, D_SU, false, 0, 0}, >> - {OPT_D, D_SW, false, 0, 0}, >> - {OPT_D, D_SUNIT, false, 0, 0}, >> - {OPT_D, D_SWIDTH, false, 0, 0}, >> + .conflicts = { {OPT_D, D_SU, false, false, 0, 0}, >> + {OPT_D, D_SW, false, false, 0, 0}, >> + {OPT_D, D_SUNIT, false, false, 0, 0}, >> + {OPT_D, D_SWIDTH, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .minval = 0, >> .maxval = 1, >> @@ -404,7 +407,7 @@ struct opt_params { >> }, >> .subopt_params = { >> { .index = I_ALIGN, >> - .conflicts = { {OPT_M, M_CRC, true, 1, 0, >> + .conflicts = { {OPT_M, M_CRC, true, true, 1, 0, >> "Inodes always aligned for CRC enabled filesytems."}, >> {LAST_CONFLICT} }, >> .minval = 0, >> @@ -412,8 +415,8 @@ struct opt_params { >> .defaultval = 1, >> }, >> { .index = I_LOG, >> - .conflicts = { {OPT_I, I_PERBLOCK, false, 0, 0}, >> - {OPT_I, I_SIZE, false, 0, 0}, >> + .conflicts = { {OPT_I, I_PERBLOCK, false, false, 0, 0}, >> + {OPT_I, I_SIZE, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .minval = XFS_DINODE_MIN_LOG, >> .maxval = XFS_DINODE_MAX_LOG, >> @@ -426,8 +429,8 @@ struct opt_params { >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = I_PERBLOCK, >> - .conflicts = { {OPT_I, I_LOG, false, 0, 0}, >> - {OPT_I, I_SIZE, false, 0, 0}, >> + .conflicts = { {OPT_I, I_LOG, false, false, 0, 0}, >> + {OPT_I, I_SIZE, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .is_power_2 = true, >> .minval = XFS_MIN_INODE_PERBLOCK, >> @@ -435,8 +438,8 @@ struct opt_params { >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = I_SIZE, >> - .conflicts = { {OPT_I, I_PERBLOCK, false, 0, 0}, >> - {OPT_I, I_LOG, false, 0, 0}, >> + .conflicts = { {OPT_I, I_PERBLOCK, false, false, 0, 0}, >> + {OPT_I, I_LOG, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .is_power_2 = true, >> .minval = XFS_DINODE_MIN_SIZE, >> @@ -444,7 +447,7 @@ struct opt_params { >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = I_ATTR, >> - .conflicts = { {OPT_M, M_CRC, true, 1, 1, >> + .conflicts = { {OPT_M, M_CRC, true, true, 1, 1, >> "V2 attribute format always enabled on CRC enabled filesytems."}, >> {LAST_CONFLICT} }, >> .minval = 0, >> @@ -452,7 +455,7 @@ struct opt_params { >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = I_PROJID32BIT, >> - .conflicts = { {OPT_M, M_CRC, true, 1, 0, >> + .conflicts = { {OPT_M, M_CRC, true, true, 1, 0, >> "32 bit Project IDs always enabled on CRC enabled filesytems."}, >> {LAST_CONFLICT} }, >> >> @@ -461,7 +464,7 @@ struct opt_params { >> .defaultval = 1, >> }, >> { .index = I_SPINODES, >> - .conflicts = { {OPT_M, M_CRC, true, 0, 1, >> + .conflicts = { {OPT_M, M_CRC, true, true, 0, 1, >> "Sparse inodes not supported without CRC support."}, >> {LAST_CONFLICT} }, >> .minval = 0, >> @@ -490,15 +493,15 @@ struct opt_params { >> }, >> .subopt_params = { >> { .index = L_AGNUM, >> - .conflicts = { {OPT_L, L_DEV, false, 0, 0}, >> + .conflicts = { {OPT_L, L_DEV, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .minval = 0, >> .maxval = UINT_MAX, >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = L_INTERNAL, >> - .conflicts = { {OPT_L, L_FILE, false, 0, 0}, >> - {OPT_L, L_DEV, false, 0, 0}, >> + .conflicts = { {OPT_L, L_FILE, false, false, 0, 0}, >> + {OPT_L, L_DEV, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .minval = 0, >> .maxval = 1, >> @@ -512,7 +515,7 @@ struct opt_params { >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = L_VERSION, >> - .conflicts = { {OPT_M, M_CRC, true, 1, 1, >> + .conflicts = { {OPT_M, M_CRC, true, true, 1, 1, >> "V2 logs are required for CRC enabled filesystems."}, >> {LAST_CONFLICT} }, >> .minval = 1, >> @@ -520,14 +523,14 @@ struct opt_params { >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = L_SUNIT, >> - .conflicts = { {OPT_L, L_SU, false, 0, 0}, >> + .conflicts = { {OPT_L, L_SU, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .minval = 1, >> .maxval = BTOBB(XLOG_MAX_RECORD_BSIZE), >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = L_SU, >> - .conflicts = { {OPT_L, L_SUNIT, false, 0, 0}, >> + .conflicts = { {OPT_L, L_SUNIT, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .convert = true, >> .minval = BBTOB(1), >> @@ -535,20 +538,20 @@ struct opt_params { >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = L_DEV, >> - .conflicts = { {OPT_L, L_AGNUM, false, 0, 0}, >> - {OPT_L, L_INTERNAL, false, 0, 0}, >> + .conflicts = { {OPT_L, L_AGNUM, false, false, 0, 0}, >> + {OPT_L, L_INTERNAL, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = L_SECTLOG, >> - .conflicts = { {OPT_L, L_SECTSIZE, false, 0, 0}, >> + .conflicts = { {OPT_L, L_SECTSIZE, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .minval = XFS_MIN_SECTORSIZE_LOG, >> .maxval = XFS_MAX_SECTORSIZE_LOG, >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = L_SECTSIZE, >> - .conflicts = { {OPT_L, L_SECTLOG, false, 0, 0}, >> + .conflicts = { {OPT_L, L_SECTLOG, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .convert = true, >> .is_power_2 = true, >> @@ -557,20 +560,20 @@ struct opt_params { >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = L_FILE, >> - .conflicts = { {OPT_L, L_INTERNAL, false, 0, 0}, >> + .conflicts = { {OPT_L, L_INTERNAL, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .minval = 0, >> .maxval = 1, >> .defaultval = 1, >> }, >> { .index = L_NAME, >> - .conflicts = { {OPT_L, L_AGNUM, false, 0, 0}, >> - {OPT_L, L_INTERNAL, false, 0, 0}, >> + .conflicts = { {OPT_L, L_AGNUM, false, false, 0, 0}, >> + {OPT_L, L_INTERNAL, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = L_LAZYSBCNTR, >> - .conflicts = { {OPT_M, M_CRC, true, 1, 0, >> + .conflicts = { {OPT_M, M_CRC, true, true, 1, 0, >> "Lazy superblock counted always enabled for CRC enabled filesytems."}, >> {LAST_CONFLICT} }, >> .minval = 0, >> @@ -591,14 +594,14 @@ struct opt_params { >> }, >> .subopt_params = { >> { .index = N_LOG, >> - .conflicts = { {OPT_N, N_SIZE, false, 0, 0}, >> + .conflicts = { {OPT_N, N_SIZE, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .minval = XFS_MIN_REC_DIRSIZE, >> .maxval = XFS_MAX_BLOCKSIZE_LOG, >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = N_SIZE, >> - .conflicts = { {OPT_N, N_LOG, false, 0, 0}, >> + .conflicts = { {OPT_N, N_LOG, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .convert = true, >> .is_power_2 = true, >> @@ -613,7 +616,7 @@ struct opt_params { >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = N_FTYPE, >> - .conflicts = { {OPT_M, M_CRC, true, 1, 0, >> + .conflicts = { {OPT_M, M_CRC, true, true, 1, 0, >> "Cannot disable ftype with crcs enabled."}, >> {LAST_CONFLICT} }, >> .minval = 0, >> @@ -650,7 +653,7 @@ struct opt_params { >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = R_DEV, >> - .conflicts = { {OPT_M, M_RMAPBT, false, 0, 0, >> + .conflicts = { {OPT_M, M_RMAPBT, false, true, 0, 0, >> "rmapbt not supported without CRC support."}, >> {LAST_CONFLICT} }, >> .defaultval = SUBOPT_NEEDS_VAL, >> @@ -662,7 +665,7 @@ struct opt_params { >> .conflicts = { {LAST_CONFLICT} }, >> }, >> { .index = R_NAME, >> - .conflicts = { {OPT_M, M_RMAPBT, false, 0, 0, >> + .conflicts = { {OPT_M, M_RMAPBT, false, true, 0, 0, >> "rmapbt not supported without CRC support."}, >> {LAST_CONFLICT} }, >> .defaultval = SUBOPT_NEEDS_VAL, >> @@ -687,24 +690,24 @@ struct opt_params { >> }, >> .subopt_params = { >> { .index = S_LOG, >> - .conflicts = { {OPT_S, S_SIZE, false, 0, 0}, >> - {OPT_S, S_SECTSIZE, false, 0, 0}, >> + .conflicts = { {OPT_S, S_SIZE, false, false, 0, 0}, >> + {OPT_S, S_SECTSIZE, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .minval = XFS_MIN_SECTORSIZE_LOG, >> .maxval = XFS_MAX_SECTORSIZE_LOG, >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = S_SECTLOG, >> - .conflicts = { {OPT_S, S_SIZE, false, 0, 0}, >> - {OPT_S, S_SECTSIZE, false, 0, 0}, >> + .conflicts = { {OPT_S, S_SIZE, false, false, 0, 0}, >> + {OPT_S, S_SECTSIZE, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .minval = XFS_MIN_SECTORSIZE_LOG, >> .maxval = XFS_MAX_SECTORSIZE_LOG, >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = S_SIZE, >> - .conflicts = { {OPT_S, S_LOG, false, 0, 0}, >> - {OPT_S, S_SECTLOG, false, 0, 0}, >> + .conflicts = { {OPT_S, S_LOG, false, false, 0, 0}, >> + {OPT_S, S_SECTLOG, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .convert = true, >> .is_power_2 = true, >> @@ -713,8 +716,8 @@ struct opt_params { >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = S_SECTSIZE, >> - .conflicts = { {OPT_S, S_LOG, false, 0, 0}, >> - {OPT_S, S_SECTLOG, false, 0, 0}, >> + .conflicts = { {OPT_S, S_LOG, false, false, 0, 0}, >> + {OPT_S, S_SECTLOG, false, false, 0, 0}, >> {LAST_CONFLICT} }, >> .convert = true, >> .is_power_2 = true, >> @@ -737,25 +740,25 @@ struct opt_params { >> }, >> .subopt_params = { >> { .index = M_CRC, >> - .conflicts = { {OPT_L, L_VERSION, true, 1, 1, >> + .conflicts = { {OPT_L, L_VERSION, true, true, 1, 1, >> "V2 logs are required for CRC enabled filesystems."}, >> - {OPT_I, I_ALIGN, true, 0, 1, >> + {OPT_I, I_ALIGN, false, true, 0, 1, >> "Inodes always aligned for CRC enabled filesytems."}, >> - {OPT_I, I_PROJID32BIT, true, 0, 1, >> + {OPT_I, I_PROJID32BIT, true, true, 0, 1, >> "32 bit Project IDs always enabled on CRC enabled filesytems."}, >> - {OPT_I, I_ATTR, true, 1, 1, >> + {OPT_I, I_ATTR, true, true, 1, 1, >> "V2 attribute format always enabled on CRC enabled filesytems."}, >> - {OPT_L, L_LAZYSBCNTR, true, 0, 1, >> + {OPT_L, L_LAZYSBCNTR, true, true, 0, 1, >> "Lazy superblock counted always enabled for CRC enabled filesytems."}, >> - {OPT_M, M_FINOBT, true, 1, 0, >> + {OPT_M, M_FINOBT, true, true, 1, 0, >> "Finobt not supported without CRC support."}, >> - {OPT_M, M_RMAPBT, true, 1, 0, >> + {OPT_M, M_RMAPBT, true, true, 1, 0, >> "rmapbt not supported without CRC support."}, >> - {OPT_M, M_REFLINK, true, 1, 0, >> + {OPT_M, M_REFLINK, true, true, 1, 0, >> "reflink not supported without CRC support."}, >> - {OPT_I, I_SPINODES, true, 1, 0, >> + {OPT_I, I_SPINODES, true, true, 1, 0, >> "Sparse inodes not supported without CRC support."}, >> - {OPT_N, N_FTYPE, true, 0, 1, >> + {OPT_N, N_FTYPE, true, true, 0, 1, >> "Cannot disable ftype with crcs enabled."}, >> {LAST_CONFLICT} }, >> .minval = 0, >> @@ -763,8 +766,8 @@ struct opt_params { >> .defaultval = 1, >> }, >> { .index = M_FINOBT, >> - .conflicts = { {OPT_M, M_CRC, true, 0, 1, >> - "Finobt not supported without CRC support\n"}, >> + .conflicts = { {OPT_M, M_CRC, true, true, 0, 1, >> + "Finobt not supported without CRC support."}, >> {LAST_CONFLICT} }, >> .minval = 0, >> .maxval = 1, >> @@ -775,11 +778,11 @@ struct opt_params { >> .defaultval = SUBOPT_NEEDS_VAL, >> }, >> { .index = M_RMAPBT, >> - .conflicts = { {OPT_M, M_CRC, true, 0, 1, >> + .conflicts = { {OPT_M, M_CRC, true, true, 0, 1, >> "rmapbt not supported without CRC support."}, >> - {OPT_R, R_NAME, false, 0, 0, >> + {OPT_R, R_NAME, false, true, 0, 0, >> "rmapbt not supported with realtime devices."}, >> - {OPT_R, R_DEV, false, 0, 0, >> + {OPT_R, R_DEV, false, true, 0, 0, >> "rmapbt not supported with realtime devices."}, >> {LAST_CONFLICT} }, >> .minval = 0, >> @@ -787,7 +790,7 @@ struct opt_params { >> .defaultval = 0, >> }, >> { .index = M_REFLINK, >> - .conflicts = { {OPT_M, M_CRC, true, 0, 1, >> + .conflicts = { {OPT_M, M_CRC, true, true, 0, 1, >> "reflink not supported without CRC support."}, >> {LAST_CONFLICT} }, >> .minval = 0, >> @@ -1417,7 +1420,8 @@ check_subopt_value( >> break; >> if (!conflict_opt.test_values) >> break; >> - if (opts[conflict_opt.opt].subopt_params[conflict_opt.subopt].seen && >> + if ( (opts[conflict_opt.opt].subopt_params[conflict_opt.subopt].seen || >> + conflict_opt.test_default_value) && >> opts[conflict_opt.opt].subopt_params[conflict_opt.subopt].value >> == conflict_opt.invalid_value && >> value == conflict_opt.at_value) { >> -- Jan Tulak jtulak@redhat.com / jan@tulak.me