diff options
| author | David Hollister <David.Hollister@Sun.COM> | 2009-12-18 13:03:51 -0700 |
|---|---|---|
| committer | David Hollister <David.Hollister@Sun.COM> | 2009-12-18 13:03:51 -0700 |
| commit | 56976565c7cea0f2fbde67ea3a985d8b17a71288 (patch) | |
| tree | b17e2e278312445cdd7eee6a24e409c593edbb8b /usr/src | |
| parent | b7b0558ae6cf66a2c72f08f9104c1559d962bc84 (diff) | |
| download | illumos-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.c | 23 | ||||
| -rw-r--r-- | usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c | 3 |
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) { |
