Mercurial > illumos > illumos-gate
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);