[PATCH 03/14] multipathd: clean up update_map_pr and mpath_pr_event_handle

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <bmarzins@xxxxxxxxxx>
---
 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(&param, 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, &param, 0);
 	if (ret != MPATH_PR_SUCCESS )
 	{
 		condlog(0,"%s: Reservation registration failed. Error: %d", pp->dev, ret);
 	}
-
-	free(param);
 }
-- 
2.48.1





[Index of Archives]     [DM Crypt]     [Fedora Desktop]     [ATA RAID]     [Fedora Marketing]     [Fedora Packaging]     [Fedora SELinux]     [Yosemite Discussion]     [KDE Users]     [Fedora Docs]

  Powered by Linux