The mpathpersist code has many areas where it does a poor job of
mimicking the behavior of setting up persistent reservations on an
individual device, especially if paths to the multipath device are
missing or unusable. This patchset is aimed at fixing a number of
them. It is a combination of my two previous patchsets:
[PATCH 00/15] Improve mpathpersist's unavailable path handling
and
[PATCH 00/14] Additional fixes and cleanups
along with additional patches.
Issues handled by the patchset are:
- Changing or unregistering a key held by an unavailable path that also
holds the reservation. This is done by preempting the old key
(after verifying that the multipath device is holding the reservation)
- Releasing a reservation held by an unavailable path. This has always
had code to handle it, but it relied on optional Persistent
Reservation features. The new code preempts the key and then restores
the removed registered keys (while the device is suspended).
- Handling removal of keys from paths that were down when the multipath
device was unregistered.
- Changing how conflicts on key registration are handled. Instead of
the current rollback method (which was broken anyways),
libmpathpersist now retries with REGISTER AND IGNORE as long as the
REGISTER command completed successfully down some of the paths.
- Changing when the reservation key is set to fix corner cases on
failure and registration while paths are coming up.
- Retrying on conflicts in mpath_prout_common to fix corner cases when
a path is coming up while a doing a reserve, preempt or clear.
- Allowing registrations to succeed when there are retryable errors,
if the paths are actually down.
- Fixing the reservation key validation code
Changes in V2:
First set (as suggested by Martin Wilck)
0009: Added a comment explaining the select_skip_kpartx()
0010: use all_threads_fail variable instead of rc.
Second set
0003 (now 0018): Remove noisy variable from update_map_pr
0007 (new 0022): Added comment explaining why we won't fail syntax error
checks after updating the reservation key, as suggested by Martin
Wilck (for patch 0012, but it made more sense to change it here)
0030 new patch to not attempt workaround when a release fails due to a
mismatched type.
0031 new patch to fix an issue with issuing a RESERVE command to the
path that doesn't hold the reservation.
0032 new patch to fix an issue with a multipath device preempting its
own reservation key.
Benjamin Marzinski (32):
multipathd: remove thread from mpath_pr_event_handle
libmpathpersist: remove uneeded wrapper function.
libmpathpersist: reduce log level for persistent reservation checking
libmpathpersist: remove pointless update_map_pr ret value code
multipathd: use update_map_pr in mpath_pr_event_handle
libmpathpersist: limit changing prflag in update_map_pr
multipathd: Don't call update_map_pr unnecessarily
libmpathpersist: remove useless function send_prout_activepath
libmpathpersist: redesign failed release workaround
libmpathpersist: fail the release if all threads fail
libmpathpersist: Handle changing key corner case
libmpathpersist: Handle REGISTER AND IGNORE changing key corner case
libmultipath: rename prflag_value enums
libmpathpersist: use a switch statement for prout command finalizing
libmpathpersist: Add safety check for preempting on key change
libmpathpersist: remove update_map_pr code for NULL pp
libmpathpersist: move update_map_pr to multipathd
multipathd: clean up update_map_pr and mpath_pr_event_handle
libmpathpersist: clean up duplicate function declarations
multipathd: wrap setting and unsetting prflag
multipathd: unregister PR key when path is restored if necessary
libmpathpersist: Fix-up reservation_key checking
libmpathpersist: change how reservation conflicts are handled
libmpathpersist: Clear prkey in multipathd before unregistering
libmpathpersist: only clear the key if we are using the prkeys file
libmpathpersist: Restore old reservation key on failure
libmpathpersist: update reservation key before checking paths
libmpathpersist: retry on conflicts in mpath_prout_common
libmpathpersist: Don't always fail registrations for retryable errors
libmpathpersist: Don't try release workaround for invalid type
libmpathpersist: Don't fail RESERVE commands unnecessarily
libmpathpersist: reregister keys when self preempting
libmpathpersist/libmpathpersist.version | 3 +-
libmpathpersist/mpath_persist_int.c | 817 ++++++++++++++----------
libmpathpersist/mpath_persist_int.h | 4 +-
libmpathpersist/mpath_pr_ioctl.c | 12 +-
libmpathpersist/mpath_updatepr.c | 74 ++-
libmpathpersist/mpathpr.h | 3 +
libmultipath/libmultipath.version | 1 +
libmultipath/structs.h | 12 +-
mpathpersist/main.c | 2 -
multipathd/callbacks.c | 3 +
multipathd/cli.c | 4 +-
multipathd/cli.h | 3 +
multipathd/cli_handlers.c | 66 +-
multipathd/main.c | 237 ++++---
multipathd/main.h | 2 +
15 files changed, 755 insertions(+), 488 deletions(-)
--
2.50.1