dev_loss_tmo is a u32 value. However the kernel sysfs code prints it as a signed integer. This means that if dev_loss_tmo is above INT_MAX, the sysfs value will be a negative number. Parsing this was causing sysfs_set_rport_tmo() to fail.
Signed-off-by: Benjamin Marzinski <bmarz...@redhat.com> --- libmultipath/discovery.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c index ffec5162..6a45979a 100644 --- a/libmultipath/discovery.c +++ b/libmultipath/discovery.c @@ -583,7 +583,8 @@ sysfs_set_rport_tmo(struct multipath *mpp, struct path *pp) struct udev_device *rport_dev = NULL; char value[16], *eptr; char rport_id[32]; - unsigned long long tmo = 0; + long long ll_tmo; + unsigned int tmo = 0; int ret; sprintf(rport_id, "rport-%d:%d-%d", @@ -607,13 +608,13 @@ sysfs_set_rport_tmo(struct multipath *mpp, struct path *pp) "error %d", rport_id, -ret); goto out; } - tmo = strtoull(value, &eptr, 0); - if (value == eptr || tmo == ULLONG_MAX) { + ll_tmo = strtoll(value, &eptr, 0); + if (value == eptr || ll_tmo > UINT_MAX || ll_tmo < INT_MIN) { condlog(0, "%s: Cannot parse dev_loss_tmo " "attribute '%s'", rport_id, value); goto out; } - + tmo = (unsigned int)ll_tmo; /* * This is tricky. * dev_loss_tmo will be limited to 600 if fast_io_fail -- 2.17.2 -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel