On 07/01/2016 10:25 PM, Benjamin Marzinski wrote:
> 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 <[email protected]>
>> ---
>>  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.
> 
Yes, indeed. You are correct.

I will fix this up.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke                Teamlead Storage & Networking
[email protected]                                   +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)

--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to