6898776 assertion failed: DEVI(self)->devi_ref, file: ../../common/io/scsi/impl/scsi_hba.c, line: 7710
authorReed <Reed.Liu@Sun.COM>
Mon, 12 Apr 2010 15:59:57 -0600
changeset 12138 9e3607cb89ad
parent 12137 dc7053db81ef
child 12139 9b80e92356c3
6898776 assertion failed: DEVI(self)->devi_ref, file: ../../common/io/scsi/impl/scsi_hba.c, line: 7710
usr/src/uts/common/os/devcfg.c
--- a/usr/src/uts/common/os/devcfg.c	Mon Apr 12 12:24:17 2010 -0700
+++ b/usr/src/uts/common/os/devcfg.c	Mon Apr 12 15:59:57 2010 -0600
@@ -6411,7 +6411,18 @@
 	 */
 	if ((rv = devi_attach_node(dip, flags)) == NDI_SUCCESS) {
 		if ((flags & NDI_CONFIG) || DEVI_NEED_NDI_CONFIG(dip)) {
+			/*
+			 * Hold the attached dip, and exit the parent while
+			 * we drive configuration of children below the
+			 * attached dip.
+			 */
+			ndi_hold_devi(dip);
+			ndi_devi_exit(pdip, circ);
+
 			(void) ndi_devi_config(dip, flags);
+
+			ndi_devi_enter(pdip, &circ);
+			ndi_rele_devi(dip);
 		}
 
 		if (branch_event)
@@ -7022,7 +7033,6 @@
 	struct devnames *dnp;
 	dev_info_t *dip;
 	int error = DDI_FAILURE;
-	int circ;
 
 	dnp = &devnamesp[major];
 	LOCK_DEV_OPS(&dnp->dn_lock);
@@ -7041,9 +7051,7 @@
 		 */
 		if ((error == DDI_SUCCESS) && (ddi_prop_exists(DDI_DEV_T_ANY,
 		    dip, DDI_PROP_DONTPASS, "ddi-config-driver-node"))) {
-			ndi_devi_enter(dip, &circ);
 			(void) ndi_devi_config(dip, NDI_NO_EVENT);
-			ndi_devi_exit(dip, circ);
 		}
 		LOCK_DEV_OPS(&dnp->dn_lock);
 		ndi_rele_devi(dip);