On Mon, Jun 20, 2016 at 10:09:04AM +0200, Hannes Reinecke wrote:
> pathinfo() requires access to the entire configuration, not just
> hwtable. So don't pretend this is the case.
> 
> Signed-off-by: Hannes Reinecke <h...@suse.com>
> ---
>  libmpathpersist/mpath_persist.c |  6 +++---
>  libmultipath/configure.c        |  8 ++++----
>  libmultipath/discovery.c        | 37 ++++++++++++++++++-------------------
>  libmultipath/discovery.h        |  8 ++++----
>  libmultipath/structs_vec.c      |  2 +-
>  multipath/main.c                |  6 +++---
>  multipathd/cli_handlers.c       |  2 +-
>  multipathd/main.c               | 16 ++++++++--------
>  8 files changed, 42 insertions(+), 43 deletions(-)
> 

<snip>

> --- a/libmultipath/discovery.c
> +++ b/libmultipath/discovery.c
> @@ -32,7 +32,7 @@
>  #include "defaults.h"
>  
>  int
> -alloc_path_with_pathinfo (vector hwtable, struct udev_device *udevice,
> +alloc_path_with_pathinfo (struct config *conf, struct udev_device *udevice,
>                         int flag, struct path **pp_ptr)
>  {
>       int err = PATHINFO_FAILED;
> @@ -55,7 +55,7 @@ alloc_path_with_pathinfo (vector hwtable, struct 
> udev_device *udevice,
>               condlog(0, "pp->dev too small");
>       } else {
>               pp->udev = udev_device_ref(udevice);
> -             err = pathinfo(pp, hwtable, flag | DI_BLACKLIST);
> +             err = pathinfo(pp, conf, flag | DI_BLACKLIST);
>       }
>  
>       if (err)
> @@ -66,8 +66,8 @@ alloc_path_with_pathinfo (vector hwtable, struct 
> udev_device *udevice,
>  }
>  
>  int
> -store_pathinfo (vector pathvec, vector hwtable, struct udev_device *udevice,
> -             int flag, struct path **pp_ptr)
> +store_pathinfo (vector pathvec, struct config *conf,
> +             struct udev_device *udevice, int flag, struct path **pp_ptr)
>  {
>       int err = PATHINFO_FAILED;
>       struct path * pp;
> @@ -90,7 +90,7 @@ store_pathinfo (vector pathvec, vector hwtable, struct 
> udev_device *udevice,
>               goto out;
>       }
>       pp->udev = udev_device_ref(udevice);
> -     err = pathinfo(pp, hwtable, flag);
> +     err = pathinfo(pp, conf, flag);
>       if (err)
>               goto out;
>  
> @@ -126,10 +126,10 @@ path_discover (vector pathvec, struct config * conf,
>  
>       pp = find_path_by_dev(pathvec, (char *)devname);
>       if (!pp) {
> -             return store_pathinfo(pathvec, conf->hwtable,
> +             return store_pathinfo(pathvec, conf,
>                                     udevice, flag, NULL);
>       }
> -     return pathinfo(pp, conf->hwtable, flag);
> +     return pathinfo(pp, conf, flag);
>  }
>  
>  int
> @@ -1397,7 +1397,7 @@ cciss_ioctl_pathinfo (struct path * pp, int mask)
>  }
>  
>  int
> -get_state (struct path * pp, vector hwtable, int daemon)
> +get_state (struct path * pp, struct config *conf)
>  {
>       struct checker * c = &pp->checker;
>       int state;
> @@ -1405,8 +1405,8 @@ get_state (struct path * pp, vector hwtable, int daemon)
>       condlog(3, "%s: get_state", pp->dev);
>  
>       if (!checker_selected(c)) {
> -             if (daemon) {
> -                     if (pathinfo(pp, hwtable, DI_SYSFS) != PATHINFO_OK) {
> +             if (!pp->hwe) {
> +                     if (pathinfo(pp, conf, DI_SYSFS) != PATHINFO_OK) {
>                               condlog(3, "%s: couldn't get sysfs pathinfo",
>                                       pp->dev);
>                               return PATH_UNCHECKED;
> @@ -1425,12 +1425,11 @@ get_state (struct path * pp, vector hwtable, int 
> daemon)
>               }
>       }
>       checker_clear_message(c);
> -     if (daemon) {
> -             if (conf->force_sync == 0)
> -                     checker_set_async(c);
> -             else
> -                     checker_set_sync(c);
> -     }
> +     if (conf->force_sync == 0)
> +             checker_set_async(c);
> +     else
> +             checker_set_sync(c);
> +
>       if (!conf->checker_timeout &&
>           sysfs_get_timeout(pp, &(c->timeout)) <= 0)
>               c->timeout = DEF_TIMEOUT;

I don't think that this change to get_state is correct. Previously,
we've always had the checker set to synchronous mode when run by the
multipath command.  With this change the checker will now run in async
mode by default.  It should be easy to just overwrite conf->force_sync
when running the multipath command to fix this.

-Ben

--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to