Mercurial > illumos > illumos-gate
changeset 4010:d83e031dd201
6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
author | pawelw |
---|---|
date | Wed, 11 Apr 2007 10:50:16 -0700 |
parents | 1a9b4fbc0d2a |
children | c21745e4c9ae |
files | usr/src/uts/common/io/sata/impl/sata.c |
diffstat | 1 files changed, 48 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/uts/common/io/sata/impl/sata.c Wed Apr 11 10:23:43 2007 -0700 +++ b/usr/src/uts/common/io/sata/impl/sata.c Wed Apr 11 10:50:16 2007 -0700 @@ -3482,8 +3482,13 @@ * Checks if a device exists and can be access and translates common * scsi_pkt data to sata_pkt data. * - * Returns TRAN_ACCEPT if device exists and sata_pkt was set-up. - * Returns other TRAN_XXXXX values when error occured. + * Returns TRAN_ACCEPT and scsi pkt_reason CMD_CMPLT if device exists and + * sata_pkt was set-up. + * Returns TRAN_ACCEPT and scsi pkt_reason CMD_DEV_GONE if device does not + * exist and pkt_comp callback was scheduled. + + * Returns other TRAN_XXXXX values when error occured and command should be + * rejected with the returned TRAN_XXXXX value. * * This function should be called with port mutex held. */ @@ -3496,6 +3501,16 @@ SATA_DIR_NODATA_XFER, /* all other values to 0/FALSE */ }; + /* + * Pkt_reason has to be set if the pkt_comp callback is invoked, + * and that implies TRAN_ACCEPT return value. Any other returned value + * indicates that the scsi packet was not accepted (the reason will not + * be checked by the scsi traget driver). + * To make debugging easier, we set pkt_reason to know value here. + * It may be changed later when different completion reason is + * determined. + */ + spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR; /* Validate address */ switch (sata_validate_scsi_address(spx->txlt_sata_hba_inst, @@ -3574,7 +3589,11 @@ spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags. sata_ignore_dev_reset = B_TRUE; } - + /* + * At this point the generic translation routine determined that the + * scsi packet should be accepted. Packet completion reason may be + * changed later when a different completion reason is determined. + */ spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT; if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0) { @@ -3726,7 +3745,8 @@ mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) { + if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) || + (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); } @@ -3788,7 +3808,8 @@ mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) { + if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) || + (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); } @@ -3959,7 +3980,8 @@ mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) { + if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) || + (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); } @@ -4017,7 +4039,8 @@ mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) { + if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) || + (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); } @@ -4089,7 +4112,8 @@ mutex_enter(&SATA_CPORT_MUTEX(shi, cport)); - if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) { + if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) || + (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); } @@ -4194,7 +4218,8 @@ mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) { + if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) || + (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); } @@ -4277,7 +4302,8 @@ mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) { + if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) || + (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); kmem_free(buf, 1024); return (rval); @@ -4539,7 +4565,8 @@ mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) { + if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) || + (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); } @@ -4786,7 +4813,8 @@ mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) { + if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) || + (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE); return (rval); @@ -5022,7 +5050,8 @@ mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) { + if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) || + (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); } @@ -5252,7 +5281,8 @@ mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) { + if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) || + (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); } @@ -5473,7 +5503,8 @@ mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) { + if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) || + (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); } @@ -5568,7 +5599,8 @@ mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx))); - if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) { + if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) || + (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) { mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx))); return (rval); }