[PATCH 5/5] add prflag to path

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

 



The update_map will frequently be called and there will be
unnecessary checks of reseravtion. We add prflag to path
to avoid this.

The pp->state changes from others to up or ghost, the
mpath_pr_event_handle should be called. The
mpath_pr_event_handle in ev_add_path may not be called,
so set pp->prkey PRKEY_NO when path is removed.

Fix: 4db4fa
Signed-off-by: Lixiaokeng <lixiaokeng>
---
 libmpathpersist/mpath_persist.c |  2 +-
 libmultipath/structs.c          |  1 +
 libmultipath/structs.h          | 12 ++++++++++++
 multipathd/cli_handlers.c       | 15 ++++++++++-----
 multipathd/main.c               |  5 +++--
 5 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/libmpathpersist/mpath_persist.c b/libmpathpersist/mpath_persist.c
index 803a2a28..f88a2e89 100644
--- a/libmpathpersist/mpath_persist.c
+++ b/libmpathpersist/mpath_persist.c
@@ -924,7 +924,7 @@ int update_map_pr(struct multipath *mpp)

 	if (isFound)
 	{
-		mpp->prflag = 1;
+		mpp->prflag = PRFLAG_OK;
 		condlog(2, "%s: prflag flag set.", mpp->alias );
 	}

diff --git a/libmultipath/structs.c b/libmultipath/structs.c
index e8cacb4b..82dbd565 100644
--- a/libmultipath/structs.c
+++ b/libmultipath/structs.c
@@ -122,6 +122,7 @@ uninitialize_path(struct path *pp)
 	pp->dmstate = PSTATE_UNDEF;
 	pp->uid_attribute = NULL;
 	pp->getuid = NULL;
+	pp->prflag = PRFLAG_NO;

 	if (checker_selected(&pp->checker))
 		checker_put(&pp->checker);
diff --git a/libmultipath/structs.h b/libmultipath/structs.h
index 399540e7..5b77218b 100644
--- a/libmultipath/structs.h
+++ b/libmultipath/structs.h
@@ -249,6 +249,17 @@ enum recheck_wwid_states {
 	RECHECK_WWID_ON = YNU_YES,
 };

+/*
+ * PRFLAG_NO for path, it means reservation should be checked.
+ * PRFLAG_NO for multipath, it means mpp has no prkey.
+ * PRFLAG_OK for path, it means reservation has been checked.
+ * PRFLAG_OK for multipath, it means mpp has prkey.
+ */
+enum prflag_states {
+	PRFLAG_NO = 0,
+	PRFLAG_OK = 1,
+};
+
 struct vpd_vendor_page {
 	int pg;
 	const char *name;
@@ -327,6 +338,7 @@ struct path {
 	/* configlet pointers */
 	vector hwe;
 	struct gen_path generic_path;
+	int prflag;
 };

 typedef int (pgpolicyfn) (struct multipath *, vector);
diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c
index 6d3a0ae2..8662fad7 100644
--- a/multipathd/cli_handlers.c
+++ b/multipathd/cli_handlers.c
@@ -1341,7 +1341,7 @@ cli_setprstatus(void * v, char ** reply, int * len, void * data)
 		return 1;

 	if (!mpp->prflag) {
-		mpp->prflag = 1;
+		mpp->prflag = PRFLAG_OK;
 		condlog(2, "%s: prflag set", param);
 	}

@@ -1352,9 +1352,11 @@ cli_setprstatus(void * v, char ** reply, int * len, void * data)
 int
 cli_unsetprstatus(void * v, char ** reply, int * len, void * data)
 {
-	struct multipath * mpp;
-	struct vectors * vecs = (struct vectors *)data;
-	char * param = get_keyparam(v, MAP);
+	int i;
+	struct multipath *mpp;
+	struct path *pp;
+	struct vectors *vecs = (struct vectors *)data;
+	char *param = get_keyparam(v, MAP);

 	param = convert_dev(param, 0);
 	get_path_layout(vecs->pathvec, 0);
@@ -1364,7 +1366,10 @@ cli_unsetprstatus(void * v, char ** reply, int * len, void * data)
 		return 1;

 	if (mpp->prflag) {
-		mpp->prflag = 0;
+		mpp->prflag = PRFLAG_NO;
+		vector_foreach_slot(mpp->paths, pp, i) {
+			pp->prflag = PRFLAG_NO;
+		}
 		condlog(2, "%s: prflag unset", param);
 	}

diff --git a/multipathd/main.c b/multipathd/main.c
index 82ab3ed1..6ef6495b 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -506,7 +506,7 @@ retry:

 	if (mpp->prflag) {
 		vector_foreach_slot(mpp->paths, pp, i) {
-			if ((pp->state == PATH_UP)  || (pp->state == PATH_GHOST)) {
+			if (!pp->prflag && ((pp->state == PATH_UP) || (pp->state == PATH_GHOST))) {
 				/* persistent reseravtion check*/
 				mpath_pr_event_handle(pp);
 			}
@@ -3570,7 +3570,8 @@ void *  mpath_pr_event_handler_fn (void * pathp )
 	{
 		condlog(0,"%s: Reservation registration failed. Error: %d", pp->dev, ret);
 	}
-	mpp->prflag = 1;
+	mpp->prflag = PRFLAG_OK;
+	pp->prflag = PRFLAG_OK;

 	free(param);
 out:
-- 

--
dm-devel mailing list
dm-devel@xxxxxxxxxx
https://listman.redhat.com/mailman/listinfo/dm-devel




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

  Powered by Linux