Re: [PATCH 02/12] mkfs: rename defaultval to flagval in opts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Apr 25, 2017 at 6:52 PM, Eric Sandeen <sandeen@xxxxxxxxxxx> wrote:
> On 4/23/17 1:54 PM, Jan Tulak wrote:
>> The old name 'defaultval' was misleading - it is not the default value,
>> but the value the option has when used as a flag by an user.
>
> The value should only ever be 0 or 1, correct?

Not necessarily. I think we are not using anything else, but
technically, it is possible to have any number here. I admit it is
hard to came up with any useful case for what we have in mkfs, though.

>
> Ok, so I see something interesting here:
>
> # grep "flagval = " mkfs/xfs_mkfs.c | sort | uniq -c
>       1                           .flagval = 0,
>       1                         .flagval = 0,
>      14                           .flagval = 1,
>      40                           .flagval = SUBOPT_NEEDS_VAL,
>
> of the 56 subopts, only 16 are treated as a flag, and only 2 default
> to 0, while the rest default to 1.
>
> Those 2 seem like outliers: -m rmapbt and -m reflink.  What's
> going on there?
>
> In every other case where there is a subopt which is actually a
> boolean flag, a bare specification without a value means "enable
> the feature."
>
> It seems very unintuitive to have:
>
> -X THING1 -> THING1 is enabled 14 times, but
> -X THING12 - THING2 is still /disabled/ in only 2 cases
>
> I'd argue that "-m rmapbt" and "-m reflink" leaving those features
> /disabled/ is a bug, due to misunderstanding of what "defaultval"
> means, and that they should be fixed to behave like the other 14
> boolean flags.

I agree. It looks this way...

>
> i.e. I'd argue that a bare boolean flag specification should /always/
> enable the feature.  At that point, you can say within your code
> "if min = 0 and max = 1, this is a boolean, and the flag may be specified
> without a value, in which case the value is set to 1, and the feature
> is enabled."
>
> At that point you don't need this extra structure member, and you won't
> have to re-state it 56 times, thus simplifying the code.
>
> What do you think?  I'd happily review and merge 2 patches, which:
>
> 1) Makes rmapbt and reflink behave like every other boolean flag, and
>
This sounds reasonable.

> 2) Removes "defaultval" altogether, and uses min=0/max=1 as a sign that
>    the option is a boolean, with a bare flag name allowed to enable it.
>
I wonder if a .is_flag = true (and no other min/max/defaultval...)
wouldn't be better solution. the min=0/max=1 detection is a bit
implicit and may not be apparent in the future. If we limit flags to
0/1 values, then defaultval can be removed either way, but it is clear
on the first glance what the option does.

Jan

> -Eric
>
>> Signed-off-by: Jan Tulak <jtulak@xxxxxxxxxx>
>> ---
>>  mkfs/xfs_mkfs.c | 120 ++++++++++++++++++++++++++++----------------------------
>>  1 file changed, 60 insertions(+), 60 deletions(-)
>>
>> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
>> index 84674d5..0a795a6 100644
>> --- a/mkfs/xfs_mkfs.c
>> +++ b/mkfs/xfs_mkfs.c
>> @@ -112,7 +112,7 @@ uint64_t          sectorsize;
>>   *     to zero. But if one value is different: minval=0 and maxval=1,
>>   *     then it is OK.)
>>   *
>> - *   defaultval MANDATORY
>> + *   flagval MANDATORY
>>   *     The value used if user specifies the subopt, but no value.
>>   *     If the subopt accepts some values (-d file=[1|0]), then this
>>   *     sets what is used with simple specifying the subopt (-d file).
>> @@ -144,7 +144,7 @@ struct opt_params {
>>               int             conflicts[MAX_CONFLICTS];
>>               uint64_t        minval;
>>               uint64_t        maxval;
>> -             uint64_t        defaultval;
>> +             uint64_t        flagval;
>>               const char      *raw_input;
>>       }               subopt_params[MAX_SUBOPTS];
>>  };
>> @@ -164,7 +164,7 @@ struct opt_params bopts = {
>>                                LAST_CONFLICT },
>>                 .minval = XFS_MIN_BLOCKSIZE_LOG,
>>                 .maxval = XFS_MAX_BLOCKSIZE_LOG,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = B_SIZE,
>>                 .convert = true,
>> @@ -173,7 +173,7 @@ struct opt_params bopts = {
>>                                LAST_CONFLICT },
>>                 .minval = XFS_MIN_BLOCKSIZE,
>>                 .maxval = XFS_MAX_BLOCKSIZE,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>       },
>>  };
>> @@ -219,24 +219,24 @@ struct opt_params dopts = {
>>                                LAST_CONFLICT },
>>                 .minval = 1,
>>                 .maxval = XFS_MAX_AGNUMBER,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = D_FILE,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = 1,
>> -               .defaultval = 1,
>> +               .flagval = 1,
>>               },
>>               { .index = D_NAME,
>>                 .conflicts = { LAST_CONFLICT },
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = D_SIZE,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .convert = true,
>>                 .minval = XFS_AG_MIN_BYTES,
>>                 .maxval = LLONG_MAX,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = D_SUNIT,
>>                 .conflicts = { D_NOALIGN,
>> @@ -245,7 +245,7 @@ struct opt_params dopts = {
>>                                LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = UINT_MAX,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = D_SWIDTH,
>>                 .conflicts = { D_NOALIGN,
>> @@ -254,7 +254,7 @@ struct opt_params dopts = {
>>                                LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = UINT_MAX,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = D_AGSIZE,
>>                 .conflicts = { D_AGCOUNT,
>> @@ -262,7 +262,7 @@ struct opt_params dopts = {
>>                 .convert = true,
>>                 .minval = XFS_AG_MIN_BYTES,
>>                 .maxval = XFS_AG_MAX_BYTES,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = D_SU,
>>                 .conflicts = { D_NOALIGN,
>> @@ -272,7 +272,7 @@ struct opt_params dopts = {
>>                 .convert = true,
>>                 .minval = 0,
>>                 .maxval = UINT_MAX,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = D_SW,
>>                 .conflicts = { D_NOALIGN,
>> @@ -281,14 +281,14 @@ struct opt_params dopts = {
>>                                LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = UINT_MAX,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = D_SECTLOG,
>>                 .conflicts = { D_SECTSIZE,
>>                                LAST_CONFLICT },
>>                 .minval = XFS_MIN_SECTORSIZE_LOG,
>>                 .maxval = XFS_MAX_SECTORSIZE_LOG,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = D_SECTSIZE,
>>                 .conflicts = { D_SECTLOG,
>> @@ -297,7 +297,7 @@ struct opt_params dopts = {
>>                 .is_power_2 = true,
>>                 .minval = XFS_MIN_SECTORSIZE,
>>                 .maxval = XFS_MAX_SECTORSIZE,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = D_NOALIGN,
>>                 .conflicts = { D_SU,
>> @@ -307,25 +307,25 @@ struct opt_params dopts = {
>>                                LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = 1,
>> -               .defaultval = 1,
>> +               .flagval = 1,
>>               },
>>               { .index = D_RTINHERIT,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = 1,
>> -               .defaultval = 1,
>> +               .flagval = 1,
>>               },
>>               { .index = D_PROJINHERIT,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = UINT_MAX,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = D_EXTSZINHERIT,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = UINT_MAX,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>       },
>>  };
>> @@ -357,7 +357,7 @@ struct opt_params iopts = {
>>                 .conflicts = { LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = 1,
>> -               .defaultval = 1,
>> +               .flagval = 1,
>>               },
>>               { .index = I_LOG,
>>                 .conflicts = { I_PERBLOCK,
>> @@ -365,13 +365,13 @@ struct opt_params iopts = {
>>                                LAST_CONFLICT },
>>                 .minval = XFS_DINODE_MIN_LOG,
>>                 .maxval = XFS_DINODE_MAX_LOG,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = I_MAXPCT,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = 100,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = I_PERBLOCK,
>>                 .conflicts = { I_LOG,
>> @@ -380,7 +380,7 @@ struct opt_params iopts = {
>>                 .is_power_2 = true,
>>                 .minval = XFS_MIN_INODE_PERBLOCK,
>>                 .maxval = XFS_MAX_BLOCKSIZE / XFS_DINODE_MIN_SIZE,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = I_SIZE,
>>                 .conflicts = { I_PERBLOCK,
>> @@ -389,25 +389,25 @@ struct opt_params iopts = {
>>                 .is_power_2 = true,
>>                 .minval = XFS_DINODE_MIN_SIZE,
>>                 .maxval = XFS_DINODE_MAX_SIZE,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = I_ATTR,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = 2,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = I_PROJID32BIT,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = 1,
>> -               .defaultval = 1,
>> +               .flagval = 1,
>>               },
>>               { .index = I_SPINODES,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = 1,
>> -               .defaultval = 1,
>> +               .flagval = 1,
>>               },
>>       },
>>  };
>> @@ -447,7 +447,7 @@ struct opt_params lopts = {
>>                                LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = UINT_MAX,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = L_INTERNAL,
>>                 .conflicts = { L_FILE,
>> @@ -455,27 +455,27 @@ struct opt_params lopts = {
>>                                LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = 1,
>> -               .defaultval = 1,
>> +               .flagval = 1,
>>               },
>>               { .index = L_SIZE,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .convert = true,
>>                 .minval = 2 * 1024 * 1024LL,  /* XXX: XFS_MIN_LOG_BYTES */
>>                 .maxval = XFS_MAX_LOG_BYTES,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = L_VERSION,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .minval = 1,
>>                 .maxval = 2,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = L_SUNIT,
>>                 .conflicts = { L_SU,
>>                                LAST_CONFLICT },
>>                 .minval = 1,
>>                 .maxval = BTOBB(XLOG_MAX_RECORD_BSIZE),
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = L_SU,
>>                 .conflicts = { L_SUNIT,
>> @@ -483,20 +483,20 @@ struct opt_params lopts = {
>>                 .convert = true,
>>                 .minval = BBTOB(1),
>>                 .maxval = XLOG_MAX_RECORD_BSIZE,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = L_DEV,
>>                 .conflicts = { L_AGNUM,
>>                                L_INTERNAL,
>>                                LAST_CONFLICT },
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = L_SECTLOG,
>>                 .conflicts = { L_SECTSIZE,
>>                                LAST_CONFLICT },
>>                 .minval = XFS_MIN_SECTORSIZE_LOG,
>>                 .maxval = XFS_MAX_SECTORSIZE_LOG,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = L_SECTSIZE,
>>                 .conflicts = { L_SECTLOG,
>> @@ -505,26 +505,26 @@ struct opt_params lopts = {
>>                 .is_power_2 = true,
>>                 .minval = XFS_MIN_SECTORSIZE,
>>                 .maxval = XFS_MAX_SECTORSIZE,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = L_FILE,
>>                 .conflicts = { L_INTERNAL,
>>                                LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = 1,
>> -               .defaultval = 1,
>> +               .flagval = 1,
>>               },
>>               { .index = L_NAME,
>>                 .conflicts = { L_AGNUM,
>>                                L_INTERNAL,
>>                                LAST_CONFLICT },
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = L_LAZYSBCNTR,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = 1,
>> -               .defaultval = 1,
>> +               .flagval = 1,
>>               },
>>       },
>>  };
>> @@ -548,7 +548,7 @@ struct opt_params nopts = {
>>                                LAST_CONFLICT },
>>                 .minval = XFS_MIN_REC_DIRSIZE,
>>                 .maxval = XFS_MAX_BLOCKSIZE_LOG,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = N_SIZE,
>>                 .conflicts = { N_LOG,
>> @@ -557,19 +557,19 @@ struct opt_params nopts = {
>>                 .is_power_2 = true,
>>                 .minval = 1 << XFS_MIN_REC_DIRSIZE,
>>                 .maxval = XFS_MAX_BLOCKSIZE,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = N_VERSION,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .minval = 2,
>>                 .maxval = 2,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = N_FTYPE,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = 1,
>> -               .defaultval = 1,
>> +               .flagval = 1,
>>               },
>>       },
>>  };
>> @@ -597,33 +597,33 @@ struct opt_params ropts = {
>>                 .convert = true,
>>                 .minval = XFS_MIN_RTEXTSIZE,
>>                 .maxval = XFS_MAX_RTEXTSIZE,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = R_SIZE,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .convert = true,
>>                 .minval = 0,
>>                 .maxval = LLONG_MAX,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = R_DEV,
>>                 .conflicts = { LAST_CONFLICT },
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = R_FILE,
>>                 .minval = 0,
>>                 .maxval = 1,
>> -               .defaultval = 1,
>> +               .flagval = 1,
>>                 .conflicts = { LAST_CONFLICT },
>>               },
>>               { .index = R_NAME,
>>                 .conflicts = { LAST_CONFLICT },
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = R_NOALIGN,
>>                 .minval = 0,
>>                 .maxval = 1,
>> -               .defaultval = 1,
>> +               .flagval = 1,
>>                 .conflicts = { LAST_CONFLICT },
>>               },
>>       },
>> @@ -649,7 +649,7 @@ struct opt_params sopts = {
>>                                LAST_CONFLICT },
>>                 .minval = XFS_MIN_SECTORSIZE_LOG,
>>                 .maxval = XFS_MAX_SECTORSIZE_LOG,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = S_SECTLOG,
>>                 .conflicts = { S_SIZE,
>> @@ -657,7 +657,7 @@ struct opt_params sopts = {
>>                                LAST_CONFLICT },
>>                 .minval = XFS_MIN_SECTORSIZE_LOG,
>>                 .maxval = XFS_MAX_SECTORSIZE_LOG,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = S_SIZE,
>>                 .conflicts = { S_LOG,
>> @@ -667,7 +667,7 @@ struct opt_params sopts = {
>>                 .is_power_2 = true,
>>                 .minval = XFS_MIN_SECTORSIZE,
>>                 .maxval = XFS_MAX_SECTORSIZE,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = S_SECTSIZE,
>>                 .conflicts = { S_LOG,
>> @@ -677,7 +677,7 @@ struct opt_params sopts = {
>>                 .is_power_2 = true,
>>                 .minval = XFS_MIN_SECTORSIZE,
>>                 .maxval = XFS_MAX_SECTORSIZE,
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>       },
>>  };
>> @@ -702,29 +702,29 @@ struct opt_params mopts = {
>>                 .conflicts = { LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = 1,
>> -               .defaultval = 1,
>> +               .flagval = 1,
>>               },
>>               { .index = M_FINOBT,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = 1,
>> -               .defaultval = 1,
>> +               .flagval = 1,
>>               },
>>               { .index = M_UUID,
>>                 .conflicts = { LAST_CONFLICT },
>> -               .defaultval = SUBOPT_NEEDS_VAL,
>> +               .flagval = SUBOPT_NEEDS_VAL,
>>               },
>>               { .index = M_RMAPBT,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = 1,
>> -               .defaultval = 0,
>> +               .flagval = 0,
>>               },
>>               { .index = M_REFLINK,
>>                 .conflicts = { LAST_CONFLICT },
>>                 .minval = 0,
>>                 .maxval = 1,
>> -               .defaultval = 0,
>> +               .flagval = 0,
>>               },
>>       },
>>  };
>> @@ -1365,9 +1365,9 @@ getnum(
>>       check_opt(opts, index, false);
>>       /* empty strings might just return a default value */
>>       if (!str || *str == '\0') {
>> -             if (sp->defaultval == SUBOPT_NEEDS_VAL)
>> +             if (sp->flagval == SUBOPT_NEEDS_VAL)
>>                       reqval(opts->name, (char **)opts->subopts, index);
>> -             return sp->defaultval;
>> +             return sp->flagval;
>>       }
>>
>>       if (sp->minval == 0 && sp->maxval == 0) {
>>



-- 
Jan Tulak
jtulak@xxxxxxxxxx / jan@xxxxxxxx
--
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



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux