Add 0035-libmpathpersist-fix-memory-leak-in-mpath_prout_rel.patch Add 0036-libmpathpersist-retry-commands-on-other-paths-in-mpa.patch Add 0037-libmpathpersist-check-released-key-against-the-reser.patch Add 0038-multipathd-remove-thread-from-mpath_pr_event_handle.patch Add 0039-libmpathpersist-remove-uneeded-wrapper-function.patch Add 0040-libmpathpersist-reduce-log-level-for-persistent-rese.patch Add 0041-libmpathpersist-remove-pointless-update_map_pr-ret-v.patch Add 0042-multipathd-use-update_map_pr-in-mpath_pr_event_handl.patch Add 0043-libmpathpersist-limit-changing-prflag-in-update_map_.patch Add 0044-multipathd-Don-t-call-update_map_pr-unnecessarily.patch Add 0045-libmpathpersist-remove-useless-function-send_prout_a.patch Add 0046-libmpathpersist-redesign-failed-release-workaround.patch Add 0047-libmpathpersist-fail-the-release-if-all-threads-fail.patch Add 0048-libmpathpersist-Handle-changing-key-corner-case.patch Add 0049-libmpathpersist-Handle-REGISTER-AND-IGNORE-changing-.patch Add 0050-libmultipath-rename-prflag_value-enums.patch Add 0051-libmpathpersist-use-a-switch-statement-for-prout-com.patch Add 0052-libmpathpersist-Add-safety-check-for-preempting-on-k.patch Add 0053-libmpathpersist-remove-update_map_pr-code-for-NULL-p.patch Add 0054-libmpathpersist-move-update_map_pr-to-multipathd.patch Add 0055-multipathd-clean-up-update_map_pr-and-mpath_pr_event.patch Add 0056-libmpathpersist-clean-up-duplicate-function-declarat.patch Add 0057-multipathd-wrap-setting-and-unsetting-prflag.patch Add 0058-multipathd-unregister-PR-key-when-path-is-restored-i.patch Add 0059-libmpathpersist-Fix-up-reservation_key-checking.patch Add 0060-libmpathpersist-change-how-reservation-conflicts-are.patch Add 0061-libmpathpersist-Clear-prkey-in-multipathd-before-unr.patch Add 0062-libmpathpersist-only-clear-the-key-if-we-are-using-t.patch Add 0063-libmpathpersist-Restore-old-reservation-key-on-failu.patch Add 0064-libmpathpersist-update-reservation-key-before-checki.patch Add 0065-libmpathpersist-retry-on-conflicts-in-mpath_prout_co.patch Add 0066-libmpathpersist-Don-t-always-fail-registrations-for-.patch Add 0067-libmpathpersist-Don-t-try-release-workaround-for-inv.patch Add 0068-libmpathpersist-Don-t-fail-RESERVE-commands-unnecess.patch Add 0069-libmpathpersist-reregister-keys-when-self-preempting.patch Add 0070-libmpathpersist-handle-updating-key-race-condition.patch Add 0071-libmpathpersist-handle-preempting-all-registrants-re.patch Add 0072-libmpathpersist-Fix-REGISTER-AND-IGNORE-while-holdin.patch Add 0073-libmpathpersist-Handle-RESERVE-with-reservation-held.patch Add 0074-libmpathpersist-use-check_holding_reservation-in-mpa.patch Add 0075-libmpathpersist-Fix-unregistering-while-holding-the-.patch Add 0076-libmpathpersist-Fix-race-between-restoring-a-path-an.patch Add 0077-multipathd-Fix-tracking-of-old-PR-key.patch * Fixes RHEL-118720 ("There are many bugs in multipath's persistent reservation handling [rhel-10]") Resolves: RHEL-118720
223 lines
6.6 KiB
Diff
223 lines
6.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
|
Date: Fri, 25 Jul 2025 23:58:43 -0400
|
|
Subject: [PATCH] libmpathpersist: move update_map_pr to multipathd
|
|
|
|
multipathd is now the only program that calls update_map_pr(), so move
|
|
it there, and make it static. There are no other code changes.
|
|
|
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
|
---
|
|
libmpathpersist/libmpathpersist.version | 1 -
|
|
libmpathpersist/mpath_persist_int.c | 83 -------------------------
|
|
libmpathpersist/mpath_persist_int.h | 3 +-
|
|
multipathd/main.c | 80 ++++++++++++++++++++++++
|
|
4 files changed, 81 insertions(+), 86 deletions(-)
|
|
|
|
diff --git a/libmpathpersist/libmpathpersist.version b/libmpathpersist/libmpathpersist.version
|
|
index faa4257b..8068920e 100644
|
|
--- a/libmpathpersist/libmpathpersist.version
|
|
+++ b/libmpathpersist/libmpathpersist.version
|
|
@@ -33,5 +33,4 @@ __LIBMPATHPERSIST_INT_2.0.0 {
|
|
mpath_alloc_prin_response;
|
|
prin_do_scsi_ioctl;
|
|
prout_do_scsi_ioctl;
|
|
- update_map_pr;
|
|
};
|
|
diff --git a/libmpathpersist/mpath_persist_int.c b/libmpathpersist/mpath_persist_int.c
|
|
index 04bbc455..76bdbc63 100644
|
|
--- a/libmpathpersist/mpath_persist_int.c
|
|
+++ b/libmpathpersist/mpath_persist_int.c
|
|
@@ -821,86 +821,3 @@ out1:
|
|
free(alias);
|
|
return ret;
|
|
}
|
|
-
|
|
-int update_map_pr(struct multipath *mpp, struct path *pp)
|
|
-{
|
|
- int noisy=0;
|
|
- struct prin_resp *resp;
|
|
- unsigned int i;
|
|
- int ret = MPATH_PR_OTHER, isFound;
|
|
- bool was_set = (mpp->prflag == PR_SET);
|
|
-
|
|
- /* If pr is explicitly unset, it must be manually set */
|
|
- if (mpp->prflag == PR_UNSET)
|
|
- return MPATH_PR_SKIP;
|
|
-
|
|
- if (!get_be64(mpp->reservation_key))
|
|
- {
|
|
- /* Nothing to do. Assuming pr mgmt feature is disabled*/
|
|
- mpp->prflag = PR_UNSET;
|
|
- condlog(was_set ? 2 : 4,
|
|
- "%s: reservation_key not set in multipath.conf",
|
|
- mpp->alias);
|
|
- return MPATH_PR_SKIP;
|
|
- }
|
|
-
|
|
- resp = mpath_alloc_prin_response(MPATH_PRIN_RKEY_SA);
|
|
- if (!resp)
|
|
- {
|
|
- condlog(0,"%s : failed to alloc resp in update_map_pr", mpp->alias);
|
|
- return MPATH_PR_OTHER;
|
|
- }
|
|
-
|
|
- ret = prin_do_scsi_ioctl(pp->dev, MPATH_PRIN_RKEY_SA, resp, noisy);
|
|
- if (ret != MPATH_PR_SUCCESS )
|
|
- {
|
|
- if (ret == MPATH_PR_ILLEGAL_REQ)
|
|
- mpp->prflag = PR_UNSET;
|
|
- condlog(0,"%s : pr in read keys service action failed Error=%d", mpp->alias, ret);
|
|
- goto out;
|
|
- }
|
|
- mpp->prflag = PR_UNSET;
|
|
-
|
|
- if (resp->prin_descriptor.prin_readkeys.additional_length == 0 )
|
|
- {
|
|
- condlog(was_set ? 1 : 3,
|
|
- "%s: No key found. Device may not be registered. ",
|
|
- mpp->alias);
|
|
- goto out;
|
|
- }
|
|
-
|
|
- condlog(3, "%s: Multipath reservation_key: 0x%" PRIx64 " ", mpp->alias,
|
|
- get_be64(mpp->reservation_key));
|
|
-
|
|
- isFound =0;
|
|
- for (i = 0; i < resp->prin_descriptor.prin_readkeys.additional_length/8; i++ )
|
|
- {
|
|
- if (libmp_verbosity >= 3) {
|
|
- condlog(3, "%s: PR IN READKEYS[%d] reservation key:",
|
|
- mpp->alias, i);
|
|
- dumpHex((char *)&resp->prin_descriptor.prin_readkeys
|
|
- .key_list[i * 8],
|
|
- 8, 1);
|
|
- }
|
|
-
|
|
- if (!memcmp(&mpp->reservation_key,
|
|
- &resp->prin_descriptor.prin_readkeys.key_list[i * 8],
|
|
- 8)) {
|
|
- condlog(3, "%s: reservation key found in pr in readkeys response",
|
|
- mpp->alias);
|
|
- isFound =1;
|
|
- }
|
|
- }
|
|
-
|
|
- if (isFound)
|
|
- {
|
|
- mpp->prflag = PR_SET;
|
|
- condlog(was_set ? 3 : 2, "%s: key found. prflag set.", mpp->alias);
|
|
- } else
|
|
- condlog(was_set ? 1 : 3, "%s: key not found. prflag unset.",
|
|
- mpp->alias);
|
|
-
|
|
-out:
|
|
- free(resp);
|
|
- return ret;
|
|
-}
|
|
diff --git a/libmpathpersist/mpath_persist_int.h b/libmpathpersist/mpath_persist_int.h
|
|
index 73c95863..d9fc7448 100644
|
|
--- a/libmpathpersist/mpath_persist_int.h
|
|
+++ b/libmpathpersist/mpath_persist_int.h
|
|
@@ -19,7 +19,6 @@ int do_mpath_persistent_reserve_out(vector curmp, vector pathvec, int fd,
|
|
int prin_do_scsi_ioctl(char * dev, int rq_servact, struct prin_resp * resp, int noisy);
|
|
int prout_do_scsi_ioctl( char * dev, int rq_servact, int rq_scope,
|
|
unsigned int rq_type, struct prout_param_descriptor *paramp, int noisy);
|
|
-void dumpHex(const char* , int len, int no_ascii);
|
|
-int update_map_pr(struct multipath *mpp, struct path *pp);
|
|
+void dumpHex(const char *, int len, int no_ascii);
|
|
|
|
#endif /* _MPATH_PERSIST_INT_H */
|
|
diff --git a/multipathd/main.c b/multipathd/main.c
|
|
index d1d209d3..0af9cb1c 100644
|
|
--- a/multipathd/main.c
|
|
+++ b/multipathd/main.c
|
|
@@ -3966,6 +3966,86 @@ static void check_prhold(struct multipath *mpp, struct path *pp)
|
|
mpp->prhold = PR_SET;
|
|
}
|
|
|
|
+static int update_map_pr(struct multipath *mpp, struct path *pp)
|
|
+{
|
|
+ int noisy = 0;
|
|
+ struct prin_resp *resp;
|
|
+ unsigned int i;
|
|
+ int ret = MPATH_PR_OTHER, isFound;
|
|
+ bool was_set = (mpp->prflag == PR_SET);
|
|
+
|
|
+ /* If pr is explicitly unset, it must be manually set */
|
|
+ if (mpp->prflag == PR_UNSET)
|
|
+ return MPATH_PR_SKIP;
|
|
+
|
|
+ if (!get_be64(mpp->reservation_key)) {
|
|
+ /* Nothing to do. Assuming pr mgmt feature is disabled*/
|
|
+ mpp->prflag = PR_UNSET;
|
|
+ condlog(was_set ? 2 : 4,
|
|
+ "%s: reservation_key not set in multipath.conf",
|
|
+ mpp->alias);
|
|
+ return MPATH_PR_SKIP;
|
|
+ }
|
|
+
|
|
+ resp = mpath_alloc_prin_response(MPATH_PRIN_RKEY_SA);
|
|
+ if (!resp) {
|
|
+ condlog(0, "%s : failed to alloc resp in update_map_pr",
|
|
+ mpp->alias);
|
|
+ return MPATH_PR_OTHER;
|
|
+ }
|
|
+
|
|
+ ret = prin_do_scsi_ioctl(pp->dev, MPATH_PRIN_RKEY_SA, resp, noisy);
|
|
+ if (ret != MPATH_PR_SUCCESS) {
|
|
+ if (ret == MPATH_PR_ILLEGAL_REQ)
|
|
+ mpp->prflag = PR_UNSET;
|
|
+ condlog(0, "%s : pr in read keys service action failed Error=%d",
|
|
+ mpp->alias, ret);
|
|
+ goto out;
|
|
+ }
|
|
+ mpp->prflag = PR_UNSET;
|
|
+
|
|
+ if (resp->prin_descriptor.prin_readkeys.additional_length == 0) {
|
|
+ condlog(was_set ? 1 : 3,
|
|
+ "%s: No key found. Device may not be registered. ",
|
|
+ mpp->alias);
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ condlog(3, "%s: Multipath reservation_key: 0x%" PRIx64 " ", mpp->alias,
|
|
+ get_be64(mpp->reservation_key));
|
|
+
|
|
+ isFound = 0;
|
|
+ for (i = 0;
|
|
+ i < resp->prin_descriptor.prin_readkeys.additional_length / 8; i++) {
|
|
+ if (libmp_verbosity >= 3) {
|
|
+ condlog(3, "%s: PR IN READKEYS[%d] reservation key:",
|
|
+ mpp->alias, i);
|
|
+ dumpHex((char *)&resp->prin_descriptor.prin_readkeys
|
|
+ .key_list[i * 8],
|
|
+ 8, 1);
|
|
+ }
|
|
+
|
|
+ if (!memcmp(&mpp->reservation_key,
|
|
+ &resp->prin_descriptor.prin_readkeys.key_list[i * 8],
|
|
+ 8)) {
|
|
+ condlog(3, "%s: reservation key found in pr in readkeys response",
|
|
+ mpp->alias);
|
|
+ isFound = 1;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (isFound) {
|
|
+ mpp->prflag = PR_SET;
|
|
+ condlog(was_set ? 3 : 2, "%s: key found. prflag set.", mpp->alias);
|
|
+ } else
|
|
+ condlog(was_set ? 1 : 3, "%s: key not found. prflag unset.",
|
|
+ mpp->alias);
|
|
+
|
|
+out:
|
|
+ free(resp);
|
|
+ return ret;
|
|
+}
|
|
+
|
|
static void mpath_pr_event_handle(struct path *pp)
|
|
{
|
|
struct multipath *mpp = pp->mpp;
|