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
78 lines
2.8 KiB
Diff
78 lines
2.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
|
Date: Thu, 10 Jul 2025 14:10:52 -0400
|
|
Subject: [PATCH] multipathd: Don't call update_map_pr unnecessarily
|
|
|
|
None of the calls to update_map_pr() outside of mpath_pr_event_handle()
|
|
add any benefit. When update_map_pr() is called without a path, it tries
|
|
to read the pr keys list on each usable path until it succeeds, and then
|
|
checks the keys to see if they include the configured key.
|
|
|
|
In all cases where update_map_pr() is called outside of
|
|
mpath_pr_event_handle(), after it is called, pr_register_active_paths()
|
|
is called if a matching key was found. pr_register_active_paths() calls
|
|
mpath_pr_event_handle() on each usable path, which calls update_map_pr()
|
|
with a path, so it only checks that path. If a matching key is found, it
|
|
registers a key on the current path. The result is that after
|
|
pr_register_active_paths() is called, update_map_pr() will be called for
|
|
each usable path, just like update_map_pr() did. So calling
|
|
update_map_pr() first doesn't change the results for multipathd, it just
|
|
adds duplicate work, so remove those calls.
|
|
|
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
|
---
|
|
multipathd/main.c | 18 +++++++-----------
|
|
1 file changed, 7 insertions(+), 11 deletions(-)
|
|
|
|
diff --git a/multipathd/main.c b/multipathd/main.c
|
|
index 390632a6..4a1b38e9 100644
|
|
--- a/multipathd/main.c
|
|
+++ b/multipathd/main.c
|
|
@@ -644,6 +644,8 @@ pr_register_active_paths(struct multipath *mpp)
|
|
|
|
vector_foreach_slot (mpp->pg, pgp, i) {
|
|
vector_foreach_slot (pgp->paths, pp, j) {
|
|
+ if (mpp->prflag == PRFLAG_UNSET)
|
|
+ return;
|
|
if ((pp->state == PATH_UP) || (pp->state == PATH_GHOST))
|
|
mpath_pr_event_handle(pp);
|
|
}
|
|
@@ -732,10 +734,7 @@ fail:
|
|
|
|
sync_map_state(mpp);
|
|
|
|
- if (mpp->prflag != PRFLAG_SET)
|
|
- update_map_pr(mpp, NULL);
|
|
- if (mpp->prflag == PRFLAG_SET)
|
|
- pr_register_active_paths(mpp);
|
|
+ pr_register_active_paths(mpp);
|
|
|
|
if (VECTOR_SIZE(offline_paths) != 0)
|
|
handle_orphaned_offline_paths(offline_paths);
|
|
@@ -1382,10 +1381,9 @@ rescan:
|
|
sync_map_state(mpp);
|
|
|
|
if (retries >= 0) {
|
|
- if (start_waiter)
|
|
- update_map_pr(mpp, NULL);
|
|
- if (mpp->prflag == PRFLAG_SET && prflag != PRFLAG_SET)
|
|
- pr_register_active_paths(mpp);
|
|
+ if ((mpp->prflag == PRFLAG_SET && prflag != PRFLAG_SET) ||
|
|
+ start_waiter)
|
|
+ pr_register_active_paths(mpp);
|
|
condlog(2, "%s [%s]: path added to devmap %s",
|
|
pp->dev, pp->dev_t, mpp->alias);
|
|
return 0;
|
|
@@ -3028,9 +3026,7 @@ configure (struct vectors * vecs, enum force_reload_types reload_type)
|
|
vector_foreach_slot(mpvec, mpp, i){
|
|
if (remember_wwid(mpp->wwid) == 1)
|
|
trigger_paths_udev_change(mpp, true);
|
|
- update_map_pr(mpp, NULL);
|
|
- if (mpp->prflag == PRFLAG_SET)
|
|
- pr_register_active_paths(mpp);
|
|
+ pr_register_active_paths(mpp);
|
|
}
|
|
|
|
/*
|