summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/os/instance.c
diff options
context:
space:
mode:
authorJan Setje-Eilers <Jan.Setje-Eilers@Sun.COM>2010-06-26 15:12:38 -0700
committerJan Setje-Eilers <Jan.Setje-Eilers@Sun.COM>2010-06-26 15:12:38 -0700
commit5633e4f8e97f7c73a0a130a449ccfd2c034561ce (patch)
treed1bce4414c969dc15fa4bd4c4798aa4bb2f2436f /usr/src/uts/common/os/instance.c
parent51bd2f974defeffad92baed420db2d05d55e1481 (diff)
downloadillumos-joyent-5633e4f8e97f7c73a0a130a449ccfd2c034561ce.tar.gz
6958695 io subtree init blocked by pcieb instance collisions
6959396 panic in e_ddi_borrow_instance() after upgrade across pcieb rename 6963656 ddi-mp needs to be more supportable
Diffstat (limited to 'usr/src/uts/common/os/instance.c')
-rw-r--r--usr/src/uts/common/os/instance.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/usr/src/uts/common/os/instance.c b/usr/src/uts/common/os/instance.c
index cc5c348f6e..135a0fef60 100644
--- a/usr/src/uts/common/os/instance.c
+++ b/usr/src/uts/common/os/instance.c
@@ -1602,17 +1602,29 @@ e_ddi_borrow_instance(dev_info_t *cdip, in_node_t *cnp)
(void) ddi_pathname(cdip, curr);
if (cnp->in_drivers) {
- ddi_err(DER_PANIC, cdip, "cnp has instance: %p", cnp);
- /*NOTREACHED*/
+ /* there can be multiple drivers bound */
+ ddi_err(DER_LOG, cdip, "%s has previous binding: %s", curr,
+ cnp->in_drivers->ind_driver_name);
}
alias = ddi_curr_redirect(curr);
- kmem_free(curr, MAXPATHLEN);
+
+ /* bail here if the alias matches any other current path or itself */
+ if (alias && ((strcmp(curr, alias) == 0) ||
+ (ddi_curr_redirect(alias) != 0))) {
+ DDI_MP_DBG((CE_NOTE, "not borrowing current: %s alias: %s",
+ curr, alias));
+ goto out;
+ }
if (alias && (anp = e_ddi_path_to_instance(alias)) != NULL) {
+ DDI_MP_DBG((CE_NOTE, "borrowing current: %s alias: %s",
+ curr, alias));
cnp->in_drivers = anp->in_drivers;
anp->in_drivers = NULL;
}
+out:
+ kmem_free(curr, MAXPATHLEN);
}
void