diff options
author | Jan Setje-Eilers <Jan.Setje-Eilers@Sun.COM> | 2010-06-26 15:12:38 -0700 |
---|---|---|
committer | Jan Setje-Eilers <Jan.Setje-Eilers@Sun.COM> | 2010-06-26 15:12:38 -0700 |
commit | 5633e4f8e97f7c73a0a130a449ccfd2c034561ce (patch) | |
tree | d1bce4414c969dc15fa4bd4c4798aa4bb2f2436f /usr/src/uts/common/os/instance.c | |
parent | 51bd2f974defeffad92baed420db2d05d55e1481 (diff) | |
download | illumos-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.c | 18 |
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 |