changeset 12627:14a7fd60c4c5

6953425 Upgrades of systems using SVM backed file systems and swap are failing
author Gangadhar Mylapuram <Gangadhar.M@Sun.COM>
date Tue, 15 Jun 2010 22:56:55 -0700
parents eba16697f6c1
children 7da42ae5ee37
files usr/src/lib/libdevinfo/devfsmap.c
diffstat 1 files changed, 24 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/lib/libdevinfo/devfsmap.c	Tue Jun 15 14:16:12 2010 -0700
+++ b/usr/src/lib/libdevinfo/devfsmap.c	Tue Jun 15 22:56:55 2010 -0700
@@ -19,10 +19,8 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
  */
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
 
 #ifdef	lint
 #define	_REENTRANT	/* for localtime_r */
@@ -1564,9 +1562,20 @@
 {
 	di_devlink_handle_t devlink_hdl;
 	char devname[MAXPATHLEN];
+	int tries = 0;
+	int sleeptime = 2; /* number of seconds to sleep between retries */
+	int maxtries = 10; /* maximum number of tries */
 
 	logdmsg(("get_install_devlink: physpath = %s\n", physpath));
 
+	/*
+	 * devlink_db sync happens after MINOR_FINI_TIMEOUT_DEFAULT secs
+	 * after dev link creation. So wait for minimum that amout of time.
+	 */
+
+retry:
+	(void) sleep(sleeptime);
+
 	if ((devlink_hdl = di_devlink_init(NULL, 0)) == NULL) {
 		logdmsg(("get_install_devlink: di_devlink_init() failed: %s\n",
 		    strerror(errno)));
@@ -1575,7 +1584,18 @@
 
 	devname[0] = '\0';
 	if (di_devlink_walk(devlink_hdl, NULL, physpath, DI_PRIMARY_LINK,
-	    devname, devlink_callback) != 0 || devname[0] == '\0') {
+	    devname, devlink_callback) == 0) {
+		if (devname[0] == '\0' && tries < maxtries) {
+			tries++;
+			(void) di_devlink_fini(&devlink_hdl);
+			goto retry;
+		} else if (devname[0] == '\0') {
+			logdmsg(("get_install_devlink: di_devlink_walk"
+			    " failed: %s\n", strerror(errno)));
+			(void) di_devlink_fini(&devlink_hdl);
+			return (-1);
+		}
+	} else {
 		logdmsg(("get_install_devlink: di_devlink_walk failed: %s\n",
 		    strerror(errno)));
 		(void) di_devlink_fini(&devlink_hdl);