cciss: decode unit attention in SCSI error handling code
authorscameron@beardog.cca.cpqcorp.net <scameron@beardog.cca.cpqcorp.net>
Mon, 8 Jun 2009 21:10:57 +0000 (16:10 -0500)
committerJens Axboe <jens.axboe@oracle.com>
Tue, 9 Jun 2009 03:47:44 +0000 (05:47 +0200)
Make SCSI reset error handler decode unit attention ASC
and after a target reset wait for a unit attention that indicates
a reset occurred rather than just for any old unit attention.

Signed-off-by: Stephen M. Cameron <scameron@beardog.cca.cpqcorp.net>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>

drivers/block/cciss_scsi.c

index d2eb489..3315268 100644 (file)
@@ -1604,16 +1604,25 @@ static int wait_for_device_to_become_ready(ctlr_info_t *h,
 
                (void) process_sendcmd_error(h, c);
 
-               if (rc == 0 && c->err_info->CommandStatus == CMD_SUCCESS)
-                       break;
+               if (rc != 0)
+                       goto retry_tur;
 
-               if (rc == 0 &&
-                       c->err_info->CommandStatus == CMD_TARGET_STATUS &&
-                       c->err_info->ScsiStatus == SAM_STAT_CHECK_CONDITION &&
-                       (c->err_info->SenseInfo[2] == NO_SENSE ||
-                       c->err_info->SenseInfo[2] == UNIT_ATTENTION))
+               if (c->err_info->CommandStatus == CMD_SUCCESS)
                        break;
 
+               if (c->err_info->CommandStatus == CMD_TARGET_STATUS &&
+                       c->err_info->ScsiStatus == SAM_STAT_CHECK_CONDITION) {
+                       if (c->err_info->SenseInfo[2] == NO_SENSE)
+                               break;
+                       if (c->err_info->SenseInfo[2] == UNIT_ATTENTION) {
+                               unsigned char asc;
+                               asc = c->err_info->SenseInfo[12];
+                               check_for_unit_attention(h, c);
+                               if (asc == POWER_OR_RESET)
+                                       break;
+                       }
+               }
+retry_tur:
                printk(KERN_WARNING "cciss%d: Waiting %d secs "
                        "for device to become ready.\n",
                        h->ctlr, waittime / HZ);