changeset 11635:2d03b93bcbc0

6922016 kernel heap corruption detected 6922193 panic[cpu21]/thread=ffffff0021494c60: mutex_enter: bad mutex, lp=ffffff0552e2c708 owner=deadbeefdead
author Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
date Mon, 08 Feb 2010 17:04:51 -0500
parents ae6532b08887
children 92140a345a02
files usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_scsa.c
diffstat 1 files changed, 16 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_scsa.c	Mon Feb 08 10:05:14 2010 -0800
+++ b/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_scsa.c	Mon Feb 08 17:04:51 2010 -0500
@@ -1672,7 +1672,7 @@
 
 	do {
 		xp = pwp->targets[target];
-		if (xp == NULL) {
+		if ((xp == NULL) || (STAILQ_EMPTY(&xp->wq))) {
 			if (++target == pwp->max_dev) {
 				target = 0;
 			}
@@ -1681,11 +1681,12 @@
 
 		mutex_exit(&pwp->lock);
 		rval = pmcs_scsa_wq_run_one(pwp, xp);
+		mutex_enter(&pwp->lock);
+
 		if (rval == B_FALSE) {
-			mutex_enter(&pwp->lock);
 			break;
 		}
-		mutex_enter(&pwp->lock);
+
 		if (++target == pwp->max_dev) {
 			target = 0;
 		}
@@ -2181,6 +2182,12 @@
 	if (xp->dev_gone) {
 		mutex_exit(&xp->statlock);
 		if (!dead) {
+			mutex_enter(&xp->aqlock);
+			STAILQ_REMOVE(&xp->aq, sp, pmcs_cmd, cmd_next);
+			mutex_exit(&xp->aqlock);
+			pmcs_prt(pwp, PMCS_PRT_DEBUG1, pptr, xp,
+			    "%s: Removing cmd 0x%p (htag 0x%x) from aq",
+			    __func__, (void *)sp, sp->cmd_tag);
 			mutex_enter(&pwp->cq_lock);
 			STAILQ_INSERT_TAIL(&pwp->cq, sp, cmd_next);
 			mutex_exit(&pwp->cq_lock);
@@ -2643,6 +2650,12 @@
 	if (xp->dev_gone) {
 		mutex_exit(&xp->statlock);
 		if (!dead) {
+			mutex_enter(&xp->aqlock);
+			STAILQ_REMOVE(&xp->aq, sp, pmcs_cmd, cmd_next);
+			mutex_exit(&xp->aqlock);
+			pmcs_prt(pwp, PMCS_PRT_DEBUG1, pptr, xp,
+			    "%s: Removing cmd 0x%p (htag 0x%x) from aq",
+			    __func__, (void *)sp, sp->cmd_tag);
 			mutex_enter(&pwp->cq_lock);
 			STAILQ_INSERT_TAIL(&pwp->cq, sp, cmd_next);
 			mutex_exit(&pwp->cq_lock);