If a multipath device is removed, and check_path() checks one of its paths before multipathd processes either the uevent or the dm event from removing it, multipathd will recreate the removed device. This happens because check_path() will continute to check the removed device's former paths until an event arrives removing the device. A missing multpath device will cause the update_multipath_strings() call to fail, setting pp->dmstate to PSTATE_UNDEF. If the path is up, this dmstate will cause reinstate_path() to be called, which will also fail, because the multipath device doesn't exist. This will trigger a reload, restoring the recently removed device. This patchset handles this is two ways. The first two patches directly fix these issues in check_path(), so that a missing multipath device will no longer get recreated when checking one of its former paths. The other 5 patches add a "multipathd del maps" command, and make the mutipath command delegate flush operations to multipathd so multipathd's state remains in sync with the kernel's, while doing removes. Changes from v1: 0001: This is completely different. I've change how patch 0002 detects when a multipath device has disappeared. Instead of do_get_info, I need more return values on dm_get_map/status, and the update_multipath_* functions. I have used symbolic return values, which was the objection to the previous patch. I tried to picked generic enough names that they could be used for other devmapper.c functions as well. 0002: At Martin's suggestion, multipath now differentiates between dm failures and a missing multipath device in update_multipath_strings(). So there is no need to recheck if the device is missing. 0006: Added some man page info that was previously in patch 0007 0007: Removed mentions of the -D option in the man page and usage output. Changes from v2 (all are Martin's suggestions): 0001: Using dm_task_get_errno() and changed the names and values of the symbolic returns. 0002: Changed symbolic return names, and improved some logging. Benjamin Marzinski (7): libmultipath: make dm_get_map/status return codes symbolic multipathd: fix check_path errors with removed map libmultipath: make dm_flush_maps only return 0 on success multipathd: add "del maps" multipathd command multipath: make flushing maps work like other commands multipath: delegate flushing maps to multipathd multipath: add option to skip multipathd delegation libmultipath/config.h | 4 ++- libmultipath/configure.h | 3 -- libmultipath/devmapper.c | 63 +++++++++++++++++++++++++------------- libmultipath/devmapper.h | 8 ++++- libmultipath/structs_vec.c | 45 +++++++++++++++------------ multipath/main.c | 44 ++++++++++++++++++-------- multipath/multipath.8 | 4 +-- multipathd/cli.c | 1 + multipathd/cli_handlers.c | 19 ++++++++++++ multipathd/cli_handlers.h | 1 + multipathd/main.c | 57 ++++++++++++++++------------------ multipathd/main.h | 1 + 12 files changed, 160 insertions(+), 90 deletions(-) -- 2.17.2 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel