summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorDavid Hollister <David.Hollister@Sun.COM>2009-12-18 13:03:51 -0700
committerDavid Hollister <David.Hollister@Sun.COM>2009-12-18 13:03:51 -0700
commit56976565c7cea0f2fbde67ea3a985d8b17a71288 (patch)
treeb17e2e278312445cdd7eee6a24e409c593edbb8b /usr/src
parentb7b0558ae6cf66a2c72f08f9104c1559d962bc84 (diff)
downloadillumos-joyent-56976565c7cea0f2fbde67ea3a985d8b17a71288.tar.gz
6910000 System crashes with vts tests
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_ds.c23
-rw-r--r--usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c3
2 files changed, 21 insertions, 5 deletions
diff --git a/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_ds.c b/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_ds.c
index e4f6009b5d..51ac232757 100644
--- a/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_ds.c
+++ b/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_ds.c
@@ -622,6 +622,7 @@ pmcs_start_ssp_event_recovery(pmcs_hw_t *pwp, pmcwork_t *pwrk, uint32_t *iomb,
}
mutex_exit(&tgt->statlock);
}
+
if (pptr == NULL) {
/*
* No target, need to run RE-DISCOVERY here.
@@ -642,9 +643,11 @@ pmcs_start_ssp_event_recovery(pmcs_hw_t *pwp, pmcwork_t *pwrk, uint32_t *iomb,
return;
} else {
pmcs_lock_phy(pptr);
- mutex_enter(&tgt->statlock);
+ if (tgt) {
+ mutex_enter(&tgt->statlock);
+ }
if (event == PMCOUT_STATUS_OPEN_CNX_ERROR_IT_NEXUS_LOSS) {
- if (tgt->dev_state !=
+ if (tgt && tgt->dev_state !=
PMCS_DEVICE_STATE_NON_OPERATIONAL) {
pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, tgt,
"%s: Device at %s is non-operational",
@@ -653,7 +656,9 @@ pmcs_start_ssp_event_recovery(pmcs_hw_t *pwp, pmcwork_t *pwrk, uint32_t *iomb,
PMCS_DEVICE_STATE_NON_OPERATIONAL;
}
pptr->abort_pending = 1;
- mutex_exit(&tgt->statlock);
+ if (tgt) {
+ mutex_exit(&tgt->statlock);
+ }
pmcs_unlock_phy(pptr);
mutex_exit(&pwrk->lock);
SCHEDULE_WORK(pwp, PMCS_WORK_ABORT_HANDLE);
@@ -673,12 +678,22 @@ pmcs_start_ssp_event_recovery(pmcs_hw_t *pwp, pmcwork_t *pwrk, uint32_t *iomb,
(void) memcpy(pwrk->arg, iomb, amt);
}
cv_signal(&pwrk->sleep_cv);
- mutex_exit(&tgt->statlock);
+ if (tgt) {
+ mutex_exit(&tgt->statlock);
+ }
pmcs_unlock_phy(pptr);
mutex_exit(&pwrk->lock);
return;
}
+ if (!tgt) {
+ pmcs_prt(pwp, PMCS_PRT_DEBUG1, pptr, NULL,
+ "%s: Not scheduling SSP event recovery for NULL tgt"
+ " pwrk(%p) tag(0x%x)", __func__, (void *)pwrk,
+ pwrk->htag);
+ return;
+ }
+
/*
* To recover from primary failures,
* we need to schedule handling events recovery.
diff --git a/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c b/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c
index 3672fbf62d..dc23005b64 100644
--- a/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c
+++ b/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c
@@ -4838,8 +4838,9 @@ pmcs_ssp_tmf(pmcs_hw_t *pwp, pmcs_phy_t *pptr, uint8_t tmf, uint32_t tag,
COPY_MESSAGE(ptr, msg, 7);
pwrk->arg = msg;
pwrk->dtype = pptr->dtype;
-
xp = pptr->target;
+ pwrk->xp = xp;
+
if (xp != NULL) {
mutex_enter(&xp->statlock);
if (xp->dev_state == PMCS_DEVICE_STATE_NON_OPERATIONAL) {