[dm-devel] [PATCH 8/8] libmultipath: cleanup invalid config handling

Martin Wilck martin.wilck at suse.com
Thu Nov 4 21:11:34 UTC 2021


On Wed, 2021-10-06 at 15:04 -0500, Benjamin Marzinski wrote:
> Add error reporting to the remaining config handlers. If the value is
> invalid, do not change the existing config option's value.

Like for the previous patch, I'm unsure if this is wise. You rely on a
reasonable default being set before the function is called. I suppose
that's the case, but I like seeing the "invalid" value substituted
right there where the validity is checked. That saves us from searching
the code for the default value.

Maybe I overlooked an important rationale for not touching the values
in the case of invalid input, please explain.

Cheers,
Martin

>  Also print
> an error whenever 0 is returned for an invalid value. When the
> handler
> returns 1, config processing already fails with an error message.
> 
> Signed-off-by: Benjamin Marzinski <bmarzins at redhat.com>
> ---
>  libmultipath/dict.c | 73 +++++++++++++++++++++++++++++++------------
> --
>  1 file changed, 51 insertions(+), 22 deletions(-)
> 
> diff --git a/libmultipath/dict.c b/libmultipath/dict.c
> index e79fcdd7..8c3b5f72 100644
> --- a/libmultipath/dict.c
> +++ b/libmultipath/dict.c
> @@ -199,8 +199,11 @@ set_yes_no(vector strvec, void *ptr, const char
> *file, int line_nr)
>  
>         if (strcmp(buff, "yes") == 0 || strcmp(buff, "1") == 0)
>                 *int_ptr = YN_YES;
> -       else
> +       else if (strcmp(buff, "no") == 0 || strcmp(buff, "0") == 0)
>                 *int_ptr = YN_NO;
> +       else
> +               condlog(1, "%s line %d, invalid value for %s:
> \"%s\"",
> +                       file, line_nr, (char*)VECTOR_SLOT(strvec, 0),
> buff);
>  
>         FREE(buff);
>         return 0;
> @@ -221,7 +224,8 @@ set_yes_no_undef(vector strvec, void *ptr, const
> char *file, int line_nr)
>         else if (strcmp(buff, "yes") == 0 || strcmp(buff, "1") == 0)
>                 *int_ptr = YNU_YES;
>         else
> -               *int_ptr = YNU_UNDEF;
> +               condlog(1, "%s line %d, invalid value for %s:
> \"%s\"",
> +                       file, line_nr, (char*)VECTOR_SLOT(strvec, 0),
> buff);
>  
>         FREE(buff);
>         return 0;
> @@ -471,9 +475,6 @@ def_find_multipaths_handler(struct config *conf,
> vector strvec,
>         char *buff;
>         int i;
>  
> -       if (set_yes_no_undef(strvec, &conf->find_multipaths, file,
> line_nr) == 0 && conf->find_multipaths != FIND_MULTIPATHS_UNDEF)
> -               return 0;
> -
>         buff = set_value(strvec);
>         if (!buff)
>                 return 1;
> @@ -486,9 +487,14 @@ def_find_multipaths_handler(struct config *conf,
> vector strvec,
>                 }
>         }
>  
> -       if (conf->find_multipaths == YNU_UNDEF) {
> -               condlog(0, "illegal value for find_multipaths: %s",
> buff);
> -               conf->find_multipaths = DEFAULT_FIND_MULTIPATHS;
> +       if (i >= __FIND_MULTIPATHS_LAST) {
> +               if (strcmp(buff, "no") == 0 || strcmp(buff, "0") ==
> 0)
> +                       conf->find_multipaths = FIND_MULTIPATHS_OFF;
> +               else if (strcmp(buff, "yes") == 0 || strcmp(buff,
> "1") == 0)
> +                       conf->find_multipaths = FIND_MULTIPATHS_ON;
> +               else
> +                       condlog(1, "%s line %d, invalid value for
> find_multipaths: \"%s\"",
> +                               file, line_nr, buff);
>         }
>  
>         FREE(buff);
> @@ -537,8 +543,10 @@ static int uid_attrs_handler(struct config
> *conf, vector strvec,
>         if (!val)
>                 return 1;
>         if (parse_uid_attrs(val, conf))
> -               condlog(1, "error parsing uid_attrs: \"%s\"", val);
> -       condlog(3, "parsed %d uid_attrs", VECTOR_SIZE(&conf-
> >uid_attrs));
> +               condlog(1, "%s line %d,error parsing uid_attrs:
> \"%s\"", file,
> +                       line_nr, val);
> +       else
> +               condlog(4, "parsed %d uid_attrs", VECTOR_SIZE(&conf-
> >uid_attrs));
>         FREE(val);
>         return 0;
>  }
> @@ -766,8 +774,11 @@ def_config_dir_handler(struct config *conf,
> vector strvec, const char *file,
>                        int line_nr)
>  {
>         /* this is only valid in the main config file */
> -       if (conf->processed_main_config)
> +       if (conf->processed_main_config) {
> +               condlog(1, "%s line %d, config_dir option only valid
> in /etc/multipath.conf",
> +                       file, line_nr);
>                 return 0;
> +       }
>         return set_path(strvec, &conf->config_dir, file, line_nr);
>  }
>  declare_def_snprint(config_dir, print_str)
> @@ -825,7 +836,9 @@ set_mode(vector strvec, void *ptr, int *flags,
> const char *file, int line_nr)
>         if (sscanf(buff, "%o", &mode) == 1 && mode <= 0777) {
>                 *flags |= (1 << ATTR_MODE);
>                 *mode_ptr = mode;
> -       }
> +       } else
> +               condlog(1, "%s line %d, invalid value for mode:
> \"%s\"",
> +                       file, line_nr, buff);
>  
>         FREE(buff);
>         return 0;
> @@ -850,7 +863,9 @@ set_uid(vector strvec, void *ptr, int *flags,
> const char *file, int line_nr)
>         else if (sscanf(buff, "%u", &uid) == 1){
>                 *flags |= (1 << ATTR_UID);
>                 *uid_ptr = uid;
> -       }
> +       } else
> +               condlog(1, "%s line %d, invalid value for uid:
> \"%s\"",
> +                       file, line_nr, buff);
>  
>         FREE(buff);
>         return 0;
> @@ -876,7 +891,9 @@ set_gid(vector strvec, void *ptr, int *flags,
> const char *file, int line_nr)
>         else if (sscanf(buff, "%u", &gid) == 1){
>                 *flags |= (1 << ATTR_GID);
>                 *gid_ptr = gid;
> -       }
> +       } else
> +               condlog(1, "%s line %d, invalid value for gid:
> \"%s\"",
> +                       file, line_nr, buff);
>         FREE(buff);
>         return 0;
>  }
> @@ -978,7 +995,8 @@ set_dev_loss(vector strvec, void *ptr, const char
> *file, int line_nr)
>         if (!strcmp(buff, "infinity"))
>                 *uint_ptr = MAX_DEV_LOSS_TMO;
>         else if (sscanf(buff, "%u", uint_ptr) != 1)
> -               *uint_ptr = DEV_LOSS_TMO_UNSET;
> +               condlog(1, "%s line %d, invalid value for
> dev_loss_tmo: \"%s\"",
> +                       file, line_nr, buff);
>  
>         FREE(buff);
>         return 0;
> @@ -1012,13 +1030,19 @@ static int
>  set_pgpolicy(vector strvec, void *ptr, const char *file, int
> line_nr)
>  {
>         char * buff;
> +       int policy;
>         int *int_ptr = (int *)ptr;
>  
>         buff = set_value(strvec);
>         if (!buff)
>                 return 1;
>  
> -       *int_ptr = get_pgpolicy_id(buff);
> +       policy = get_pgpolicy_id(buff);
> +       if (policy != IOPOLICY_UNDEF)
> +               *int_ptr = policy;
> +       else
> +               condlog(1, "%s line %d, invalid value for
> path_grouping_policy: \"%s\"",
> +                       file, line_nr, buff);
>         FREE(buff);
>  
>         return 0;
> @@ -1131,10 +1155,11 @@ set_rr_weight(vector strvec, void *ptr, const
> char *file, int line_nr)
>  
>         if (!strcmp(buff, "priorities"))
>                 *int_ptr = RR_WEIGHT_PRIO;
> -
> -       if (!strcmp(buff, "uniform"))
> +       else if (!strcmp(buff, "uniform"))
>                 *int_ptr = RR_WEIGHT_NONE;
> -
> +       else
> +               condlog(1, "%s line %d, invalid value for rr_weight:
> \"%s\"",
> +                       file, line_nr, buff);
>         FREE(buff);
>  
>         return 0;
> @@ -1270,10 +1295,13 @@ def_log_checker_err_handler(struct config
> *conf, vector strvec,
>         if (!buff)
>                 return 1;
>  
> -       if (strlen(buff) == 4 && !strcmp(buff, "once"))
> +       if (!strcmp(buff, "once"))
>                 conf->log_checker_err = LOG_CHKR_ERR_ONCE;
> -       else if (strlen(buff) == 6 && !strcmp(buff, "always"))
> +       else if (!strcmp(buff, "always"))
>                 conf->log_checker_err = LOG_CHKR_ERR_ALWAYS;
> +       else
> +               condlog(1, "%s line %d, invalid value for
> log_checker_err: \"%s\"",
> +                       file, line_nr, buff);
>  

We lack a proper DEFAULT for log_checker_err.


>         free(buff);
>         return 0;
> @@ -1534,7 +1562,8 @@ hw_vpd_vendor_handler(struct config *conf,
> vector strvec, const char *file,
>                         goto out;
>                 }
>         }
> -       hwe->vpd_vendor_id = 0;
> +       condlog(1, "%s line %d, invalid value for vpd_vendor:
> \"%s\"",
> +               file, line_nr, buff);
>  out:
>         FREE(buff);
>         return 0;





More information about the dm-devel mailing list