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);
 	}