Re: [PATCH 08/17] mkfs: getbool is redundant

Brian Foster
2015-06-26T17:17:08Z

On Fri, Jun 19, 2015 at 01:01:57PM +0200, Jan Ťulák wrote:
> From: Dave Chinner <dchinner@redhat.com>
>
> getbool() can be replaced with getnum_checked with appropriate
> min/max values set for the boolean variables.
>
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
> Signed-off-by: Jan Ťulák <jtulak@redhat.com>
> ---
> mkfs/xfs_mkfs.c | 147 ++++++++++++++++++++++++++++++++++++++++----------------
> 1 file changed, 106 insertions(+), 41 deletions(-)
>
> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
> index d3d1e11..3803779 100644
> --- a/mkfs/xfs_mkfs.c
> +++ b/mkfs/xfs_mkfs.c
> @@ -53,6 +53,7 @@ static long long cvtnum(unsigned int blocksize,
> unsigned int sectorsize, const char *s);
>
> #define MAX_SUBOPTS 16
> +#define SUBOPT_NEEDS_VAL (-1LL)
> struct opt_params {
> const char name;
> const char *subopts[MAX_SUBOPTS];
> @@ -60,6 +61,7 @@ struct opt_params {
> int index;
> long long minval;
> long long maxval;
> + long long defaultval;
> } subopt_params[MAX_SUBOPTS];
> };
>
> @@ -76,10 +78,12 @@ const struct opt_params bopts = {
> { .index = B_LOG,
> .minval = XFS_MIN_BLOCKSIZE_LOG,
> .maxval = XFS_MAX_BLOCKSIZE_LOG,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = B_SIZE,
> .minval = XFS_MIN_BLOCKSIZE,
> .maxval = XFS_MAX_BLOCKSIZE,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> },
> };
> @@ -121,38 +125,55 @@ const struct opt_params dopts = {
> },
> .subopt_params = {
> { .index = D_AGCOUNT,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = D_FILE,
> + .minval = 0,
> + .maxval = 1,
> + .defaultval = 1,
> },
> { .index = D_NAME,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = D_SIZE,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = D_SUNIT,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = D_SWIDTH,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = D_AGSIZE,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = D_SU,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = D_SW,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = D_SECTLOG,
> .minval = XFS_MIN_SECTORSIZE_LOG,
> .maxval = XFS_MAX_SECTORSIZE_LOG,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = D_SECTSIZE,
> .minval = XFS_MIN_SECTORSIZE,
> .maxval = XFS_MAX_SECTORSIZE,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = D_NOALIGN,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = D_RTINHERIT,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },

I don't think the above two require values.

> { .index = D_PROJINHERIT,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = D_EXTSZINHERIT,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> },
> };
> @@ -181,20 +202,31 @@ const struct opt_params iopts = {
> },
> .subopt_params = {
> { .index = I_ALIGN,
> + .minval = 0,
> + .maxval = 1,
> + .defaultval = 1,
> },
> { .index = I_LOG,
> .minval = XFS_DINODE_MIN_LOG,
> .maxval = XFS_DINODE_MAX_LOG,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = I_MAXPCT,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = I_PERBLOCK,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = I_SIZE,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = I_ATTR,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = I_PROJID32BIT,
> + .minval = 0,
> + .maxval = 1,
> + .defaultval = 1,

Need to handle sparse here too once it's added to the previous patch.

> },
> },
> };
> @@ -230,32 +262,50 @@ const struct opt_params lopts = {
> },
> .subopt_params = {
> { .index = L_AGNUM,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = L_INTERNAL,
> + .minval = 0,
> + .maxval = 1,
> + .defaultval = 1,
> },
> { .index = L_SIZE,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = L_VERSION,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = L_SUNIT,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = L_SU,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = L_DEV,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = L_SECTLOG,
> .minval = XFS_MIN_SECTORSIZE_LOG,
> .maxval = XFS_MAX_SECTORSIZE_LOG,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = L_SECTSIZE,
> .minval = XFS_MIN_SECTORSIZE,
> .maxval = XFS_MAX_SECTORSIZE,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = L_FILE,
> + .minval = 0,
> + .maxval = 1,
> + .defaultval = 1,
> },
> { .index = L_NAME,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = L_LAZYSBCNTR,
> + .minval = 0,
> + .maxval = 1,
> + .defaultval = 1,
> },
> },
> };
> @@ -277,14 +327,20 @@ const struct opt_params nopts = {
> { .index = N_LOG,
> .minval = XFS_MIN_REC_DIRSIZE,
> .maxval = XFS_MAX_BLOCKSIZE_LOG,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = N_SIZE,
> .minval = 1 << XFS_MIN_REC_DIRSIZE,
> .maxval = XFS_MAX_BLOCKSIZE,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = N_VERSION,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = N_FTYPE,
> + .minval = 0,
> + .maxval = 1,
> + .defaultval = 0,
> },
> },
> };
> @@ -308,16 +364,22 @@ const struct opt_params ropts = {
> },
> .subopt_params = {
> { .index = R_EXTSIZE,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = R_SIZE,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = R_DEV,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = R_FILE,
> + .defaultval = SUBOPT_NEEDS_VAL,

This should have min/max/default similar to D_FILE, yes?

> },
> { .index = R_NAME,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = R_NOALIGN,
> + .defaultval = SUBOPT_NEEDS_VAL,

Not sure about this one, either. There's no value according to the man
page.

> },
> },
> };
> @@ -339,18 +401,22 @@ const struct opt_params sopts = {
> { .index = S_LOG,
> .minval = XFS_MIN_SECTORSIZE_LOG,
> .maxval = XFS_MAX_SECTORSIZE_LOG,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = S_SECTLOG,
> .minval = XFS_MIN_SECTORSIZE_LOG,
> .maxval = XFS_MAX_SECTORSIZE_LOG,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = S_SIZE,
> .minval = XFS_MIN_SECTORSIZE,
> .maxval = XFS_MAX_SECTORSIZE,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> { .index = S_SECTSIZE,
> .minval = XFS_MIN_SECTORSIZE,
> .maxval = XFS_MAX_SECTORSIZE,
> + .defaultval = SUBOPT_NEEDS_VAL,
> },
> },
> };
> @@ -366,6 +432,9 @@ const struct opt_params mopts = {
> },
> .subopt_params = {
> { .index = M_CRC,
> + .minval = 0,
> + .maxval = 1,
> + .defaultval = 0,
> },
> },

How about M_FINOBT?

Brian

> };
> @@ -1205,22 +1274,6 @@ getnum(
> return i;
> }
>
> -static bool
> -getbool(
> - const char *str,
> - const char *illegal_str,
> - bool default_val)
> -{
> - long long c;
> -
> - if (!str || *str == '\0')
> - return default_val;
> - c = getnum(str, 0, 0, false);
> - if (c < 0 || c > 1)
> - illegal(str, illegal_str);
> - return c ? true : false;
> -}
> -
> static __attribute__((noreturn)) void
> illegal_option(
> const char *value,
> @@ -1235,18 +1288,28 @@ illegal_option(
>
> static int
> getnum_checked(
> - const char *str,
> + const char *str,
> const struct opt_params *opts,
> - int index)
> + int index)
> {
> - long long c;
> + const struct subopt_param *sp = &opts->subopt_params[index];
> + long long c;
>
> - if (!str || *str == '\0')
> + if (sp->index != index) {
> + fprintf(stderr,
> + ("Developer screwed up option parsing (%d/%d)! Please report!\n"),
> + sp->index, index);
> reqval(opts->name, (char **)opts->subopts, index);
> + }
> +
> + if (!str || *str == '\0') {
> + if (sp->defaultval == SUBOPT_NEEDS_VAL)
> + reqval(opts->name, (char **)opts->subopts, index);
> + return sp->defaultval;
> + }
>
> c = getnum(str, 0, 0, false);
> - if (c < opts->subopt_params[index].minval ||
> - c > opts->subopt_params[index].maxval)
> + if (c < sp->minval || c > sp->maxval)
> illegal_option(str, opts, index);
> return c;
> }
> @@ -1470,8 +1533,8 @@ main(
> dasize = 1;
> break;
> case D_FILE:
> - xi.disfile = getbool(value, "d file",
> - true);
> + xi.disfile = getnum_checked(value,
> + &dopts, D_FILE);
> if (xi.disfile && !Nflag)
> xi.dcreat = 1;
> break;
> @@ -1613,8 +1676,8 @@ main(
> switch (getsubopt(&p, (constpp)subopts,
> &value)) {
> case I_ALIGN:
> - sb_feat.inode_align = getbool(
> - value, "i align", true);
> + sb_feat.inode_align = getnum_checked(
> + value, &iopts, I_ALIGN);
> break;
> case I_LOG:
> if (ilflag)
> @@ -1684,8 +1747,9 @@ main(
> sb_feat.attr_version = c;
> break;
> case I_PROJID32BIT:
> - sb_feat.projid16bit = !getbool(value,
> - "i projid32bit", false);
> + sb_feat.projid16bit =
> + !getnum_checked(value, &iopts,
> + I_PROJID32BIT);
> break;
> case I_SPINODES:
> if (!value || *value == '\0')
> @@ -1723,8 +1787,8 @@ main(
> if (loginternal)
> conflict('l', subopts, L_INTERNAL,
> L_FILE);
> - xi.lisfile = getbool(value, "l file",
> - true);
> + xi.lisfile = getnum_checked(value,
> + &lopts, L_FILE);
> if (xi.lisfile)
> xi.lcreat = 1;
> break;
> @@ -1737,8 +1801,8 @@ main(
> if (liflag)
> respec('l', subopts, L_INTERNAL);
>
> - loginternal = getbool(value,
> - "l internal", true);
> + loginternal = getnum_checked(value,
> + &lopts, L_INTERNAL);
> liflag = 1;
> break;
> case L_SU:
> @@ -1825,9 +1889,9 @@ main(
> lssflag = 1;
> break;
> case L_LAZYSBCNTR:
> - sb_feat.lazy_sb_counters = getbool(
> - value, "l lazy-count",
> - true);
> + sb_feat.lazy_sb_counters =
> + getnum_checked(value, &lopts,
> + L_LAZYSBCNTR);
> break;
> default:
> unknown('l', value);
> @@ -1848,8 +1912,9 @@ main(
> switch (getsubopt(&p, (constpp)subopts,
> &value)) {
> case M_CRC:
> - sb_feat.crcs_enabled = getbool(
> - value, "m crc", false);
> + sb_feat.crcs_enabled =
> + getnum_checked(value, &mopts,
> + M_CRC);
> if (sb_feat.crcs_enabled && nftype) {
> fprintf(stderr,
> _("cannot specify both -m crc=1 and -n ftype\n"));
> @@ -1932,8 +1997,8 @@ _("cannot specify both -m crc=1 and -n ftype\n"));
> _("cannot specify both -m crc=1 and -n ftype\n"));
> usage();
> }
> - sb_feat.dirftype = getbool(value,
> - "n ftype", false);
> + sb_feat.dirftype = getnum_checked(value,
> + &nopts, N_FTYPE);
> nftype = 1;
> break;
> default:
> @@ -1971,8 +2036,8 @@ _("cannot specify both -m crc=1 and -n ftype\n"));
> rtextsize = value;
> break;
> case R_FILE:
> - xi.risfile = getbool(value,
> - "r file", true);
> + xi.risfile = getnum_checked(value,
> + &ropts, R_FILE);
> if (xi.risfile)
> xi.rcreat = 1;
> break;
> --
> 2.1.0
>
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs