changeset 7461:1c206c17e7a2

6649625 MPxIO not trying on all available paths on device and path failures to storage
author Sheshadri Vasudevan <Sheshadri.Vasudevan@Sun.COM>
date Tue, 02 Sep 2008 12:33:14 -0700
parents d00be78b3176
children 9e54fd6a9996
files usr/src/uts/common/io/scsi/adapters/scsi_vhci/scsi_vhci.c usr/src/uts/common/os/sunmdi.c usr/src/uts/common/sys/mdi_impldefs.h
diffstat 3 files changed, 37 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/io/scsi/adapters/scsi_vhci/scsi_vhci.c	Tue Sep 02 11:23:23 2008 -0700
+++ b/usr/src/uts/common/io/scsi/adapters/scsi_vhci/scsi_vhci.c	Tue Sep 02 12:33:14 2008 -0700
@@ -68,7 +68,7 @@
 /*
  * Version Macros
  */
-#define	VHCI_NAME_VERSION	"SCSI VHCI Driver 1.78"
+#define	VHCI_NAME_VERSION	"SCSI VHCI Driver 1.79"
 char		vhci_version_name[] = VHCI_NAME_VERSION;
 
 int		vhci_first_time = 0;
@@ -3683,7 +3683,7 @@
 	    ddi_get_instance(ddi_get_parent(dip)));
 
 	sps = mdi_select_path(dip, NULL, (MDI_SELECT_ONLINE_PATH |
-	    MDI_SELECT_STANDBY_PATH), NULL, &npip);
+	    MDI_SELECT_STANDBY_PATH | MDI_SELECT_NO_PREFERRED), NULL, &npip);
 	if ((npip == NULL) || (sps != MDI_SUCCESS)) {
 		goto done;
 	}
@@ -3696,8 +3696,8 @@
 		if (fo->sfo_path_get_opinfo(psd, &opinfo,
 		    vlun->svl_fops_ctpriv) != 0) {
 			sps = mdi_select_path(dip, NULL,
-			    (MDI_SELECT_ONLINE_PATH | MDI_SELECT_STANDBY_PATH),
-			    pip, &npip);
+			    (MDI_SELECT_ONLINE_PATH | MDI_SELECT_STANDBY_PATH |
+			    MDI_SELECT_NO_PREFERRED), pip, &npip);
 			mdi_rele_path(pip);
 			continue;
 		}
@@ -3708,8 +3708,8 @@
 			    "!vhci_update_pathstates: prop lookup failed for "
 			    "path 0x%p\n", (void *)pip));
 			sps = mdi_select_path(dip, NULL,
-			    (MDI_SELECT_ONLINE_PATH | MDI_SELECT_STANDBY_PATH),
-			    pip, &npip);
+			    (MDI_SELECT_ONLINE_PATH | MDI_SELECT_STANDBY_PATH |
+			    MDI_SELECT_NO_PREFERRED), pip, &npip);
 			mdi_rele_path(pip);
 			continue;
 		}
@@ -3885,8 +3885,8 @@
 		}
 		(void) mdi_prop_free(pclass);
 		sps = mdi_select_path(dip, NULL,
-		    (MDI_SELECT_ONLINE_PATH | MDI_SELECT_STANDBY_PATH),
-		    pip, &npip);
+		    (MDI_SELECT_ONLINE_PATH | MDI_SELECT_STANDBY_PATH |
+		    MDI_SELECT_NO_PREFERRED), pip, &npip);
 		mdi_rele_path(pip);
 
 	} while ((npip != NULL) && (sps == MDI_SUCCESS));
--- a/usr/src/uts/common/os/sunmdi.c	Tue Sep 02 11:23:23 2008 -0700
+++ b/usr/src/uts/common/os/sunmdi.c	Tue Sep 02 12:33:14 2008 -0700
@@ -2197,6 +2197,14 @@
 		} else {
 			pip = (mdi_pathinfo_t *)MDI_PI(start)->pi_client_link;
 			if (pip == NULL) {
+				if ( flags & MDI_SELECT_NO_PREFERRED) {
+					/*
+					 * Return since we hit the end of list
+					 */
+					MDI_CLIENT_UNLOCK(ct);
+					return (MDI_NOPATH);
+				}
+
 				if (!sb) {
 					if (preferred == 0) {
 						/*
@@ -2263,6 +2271,15 @@
 					    MDI_PATHINFO_STATE_USER_DISABLE)))&&
 						MDI_PI(pip)->pi_preferred ==
 						preferred) ? 1 : 0);
+				} else if (flags ==
+				    (MDI_SELECT_STANDBY_PATH |
+				    MDI_SELECT_ONLINE_PATH |
+				    MDI_SELECT_NO_PREFERRED)) {
+					cond = (((MDI_PI(pip)->pi_state ==
+					    MDI_PATHINFO_STATE_ONLINE) ||
+					    (MDI_PI(pip)->pi_state ==
+					    MDI_PATHINFO_STATE_STANDBY))
+					    ? 1 : 0);
 				} else {
 					cond = 0;
 				}
@@ -2298,6 +2315,14 @@
 do_again:
 			next = (mdi_pathinfo_t *)MDI_PI(pip)->pi_client_link;
 			if (next == NULL) {
+				if ( flags & MDI_SELECT_NO_PREFERRED) {
+					/*
+					 * Bail out since we hit the end of list
+					 */
+					MDI_PI_UNLOCK(pip);
+					break;
+				}
+
 				if (!sb) {
 					if (preferred == 1) {
 						/*
--- a/usr/src/uts/common/sys/mdi_impldefs.h	Tue Sep 02 11:23:23 2008 -0700
+++ b/usr/src/uts/common/sys/mdi_impldefs.h	Tue Sep 02 12:33:14 2008 -0700
@@ -26,7 +26,6 @@
 #ifndef	_SYS_MDI_IMPLDEFS_H
 #define	_SYS_MDI_IMPLDEFS_H
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
 
 #include <sys/note.h>
 #include <sys/types.h>
@@ -1128,12 +1127,14 @@
  * to mdi_select_path depends on the flags used.
  *
  *   <none>:				default, arg is pip
- *   MDI_SELECT_ONLINE_PATH:		select an ONLINE path, arg is pip
+ *   MDI_SELECT_ONLINE_PATH:		select an ONLINE path preferred-first,
+ *					arg is pip
  *   MDI_SELECT_STANDBY_PATH:		select a STANDBY path, arg is pip
  *   MDI_SELECT_USER_DISABLE_PATH:	select user disable for failover and
  *					auto_failback
  *   MDI_SELECT_PATH_INSTANCE:		select a specific path, arg is
  *					path instance
+ *   MDI_SELECT_NO_PREFERRED:		select path without preferred-first
  *
  * The selected paths are returned in an mdi_hold_path() state (pi_ref_cnt),
  * caller should release the hold by calling mdi_rele_path() at the end of
@@ -1152,6 +1153,7 @@
 #define	MDI_SELECT_STANDBY_PATH		0x0002
 #define	MDI_SELECT_USER_DISABLE_PATH	0x0004
 #define	MDI_SELECT_PATH_INSTANCE	0x0008
+#define	MDI_SELECT_NO_PREFERRED		0x0010
 
 /*
  * MDI client device utility functions