Store the READ KEYS response and the prout_param_descriptor on the stack to avoid having to fail these functions for allocation reasons. Don't explicitly check for additional_length == 0, since the for-loop already handles that. Also cleanup formatting issues,remove redundant messages, and reduce the log level of others.
Signed-off-by: Benjamin Marzinski <bmarz...@redhat.com> --- multipathd/main.c | 69 +++++++++++++++++------------------------------ 1 file changed, 24 insertions(+), 45 deletions(-) diff --git a/multipathd/main.c b/multipathd/main.c index fd0c0dba..0e95ca3a 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -4251,7 +4251,7 @@ static void check_prhold(struct multipath *mpp, struct path *pp) static int update_map_pr(struct multipath *mpp, struct path *pp) { int noisy=0; - struct prin_resp *resp; + struct prin_resp resp; unsigned int i; int ret = MPATH_PR_OTHER, isFound; bool was_set = (mpp->prflag == PR_SET); @@ -4260,57 +4260,42 @@ static int update_map_pr(struct multipath *mpp, struct path *pp) if (mpp->prflag == PR_UNSET) return MPATH_PR_SKIP; - if (!get_be64(mpp->reservation_key)) - { + 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; - } + memset(&resp, 0, sizeof(resp)); - ret = prin_do_scsi_ioctl(pp->dev, MPATH_PRIN_RKEY_SA, resp, noisy); - if (ret != MPATH_PR_SUCCESS ) - { + 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; + return ret; } 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, + condlog(4, "%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:", + isFound = 0; + for (i = 0; i < resp.prin_descriptor.prin_readkeys.additional_length / 8; i++) { + uint8_t *keyp = &resp.prin_descriptor.prin_readkeys.key_list[i * 8]; + + if (libmp_verbosity >= 4) { + condlog(4, "%s: PR IN READKEYS[%d] reservation key:", mpp->alias, i); - dumpHex((char *)&resp->prin_descriptor.prin_readkeys.key_list[i * 8], 8, 1); + dumpHex((char *)keyp, 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 (!memcmp(&mpp->reservation_key, keyp, 8)) + isFound = 1; } - if (isFound) - { + if (isFound) { mpp->prflag = PR_SET; condlog(was_set ? 3 : 2, "%s: key found. prflag set.", mpp->alias); @@ -4318,16 +4303,14 @@ static int update_map_pr(struct multipath *mpp, struct path *pp) condlog(was_set ? 1 : 3, "%s: key not found. prflag unset.", mpp->alias); -out: - free(resp); - return ret; + return MPATH_PR_SUCCESS; } static void mpath_pr_event_handle(struct path *pp) { struct multipath *mpp = pp->mpp; int ret; - struct prout_param_descriptor *param; + struct prout_param_descriptor param; if (pp->bus != SYSFS_BUS_SCSI) { mpp->prflag = PR_UNSET; @@ -4345,21 +4328,17 @@ static void mpath_pr_event_handle(struct path *pp) if (mpp->prflag != PR_SET) return; - param = (struct prout_param_descriptor *)calloc(1, sizeof(struct prout_param_descriptor)); - if (!param) - return; + memset(¶m, 0, sizeof(param)); - param->sa_flags = mpp->sa_flags; - memcpy(param->sa_key, &mpp->reservation_key, 8); - param->num_transportid = 0; + param.sa_flags = mpp->sa_flags; + memcpy(param.sa_key, &mpp->reservation_key, 8); + param.num_transportid = 0; condlog(3, "device %s:%s", pp->dev, pp->mpp->wwid); - ret = prout_do_scsi_ioctl(pp->dev, MPATH_PROUT_REG_IGN_SA, 0, 0, param, 0); + ret = prout_do_scsi_ioctl(pp->dev, MPATH_PROUT_REG_IGN_SA, 0, 0, ¶m, 0); if (ret != MPATH_PR_SUCCESS ) { condlog(0,"%s: Reservation registration failed. Error: %d", pp->dev, ret); } - - free(param); } -- 2.48.1