libmultipath: fix false removes in dmevents polling code
authorBenjamin Marzinski <bmarzins@redhat.com>
Wed, 28 Nov 2018 06:13:24 +0000 (00:13 -0600)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Fri, 7 Dec 2018 15:48:11 +0000 (16:48 +0100)
commit9050cd5a12ba8ec9d2ea26a8117204790ff53975
tree785bafa7d3644d47a10b97ecc3b739d004b8256f
parent612abdd2e57b71472030841a733e67f1164bed08
libmultipath: fix false removes in dmevents polling code

dm_is_mpath() would return 0 if either a device was not a multipath
device or if the libdevmapper command failed. Because dm_is_mpath()
didn't distinguish between these situations, dm_get_events() could
assume that a device was not really a multipath device, when in fact it
was, and the libdevmapper command simply failed. This would cause the
dmevents polling waiter to stop monitoring the device.

In reality, the call to dm_is_mpath() isn't necessary, because
dm_get_events() will already verify that the device name is on the list
of devices to wait for. However, if there are a large number of
non-multipath devices on the system, ignoring them can be useful.  Thus,
if dm_is_mpath() successfully runs the libdevmapper command and verifies
that the device is not a multipath device, dm_get_events() should skip
it. But if the libdevmapper command fails, dm_get_events() should still
check the device list, to see if the device should be monitored.

This commit makes dm_is_mpath() return -1 for situations where
the libdevmapper command failed, and makes dm_get_events() only ignore
the device on a return of 0.

Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
libmpathpersist/mpath_persist.c
libmultipath/devmapper.c
multipath/main.c
multipathd/dmevents.c
multipathd/main.c