From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski 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 Reviewed-by: Martin Wilck --- 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;