scsi: hpsa: check for lv removal
authorDon Brace <don.brace@microsemi.com>
Tue, 12 Mar 2019 18:11:33 +0000 (13:11 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Mon, 18 Mar 2019 20:46:13 +0000 (16:46 -0400)
Multipath failures are normally detected at the frequency of the event
thread. Detect LUN failures earlier by checking request completion status.

Reviewed-by: Bader Ali-saleh <bader.ali-saleh@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Reviewed-by: Prasad Munirathnam <Prasad.Munirathnam@microsemi.com>
Reviewed-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/hpsa.c

index f044e7d10d63711b69de27a0567285f354e32ab5..f311ab259a02e494529a454f1629d92675158054 100644 (file)
@@ -2647,9 +2647,20 @@ static void complete_scsi_command(struct CommandList *cp)
                        decode_sense_data(ei->SenseInfo, sense_data_size,
                                &sense_key, &asc, &ascq);
                if (ei->ScsiStatus == SAM_STAT_CHECK_CONDITION) {
-                       if (sense_key == ABORTED_COMMAND) {
+                       switch (sense_key) {
+                       case ABORTED_COMMAND:
                                cmd->result |= DID_SOFT_ERROR << 16;
                                break;
+                       case UNIT_ATTENTION:
+                               if (asc == 0x3F && ascq == 0x0E)
+                                       h->drv_req_rescan = 1;
+                               break;
+                       case ILLEGAL_REQUEST:
+                               if (asc == 0x25 && ascq == 0x00) {
+                                       dev->removed = 1;
+                                       cmd->result = DID_NO_CONNECT << 16;
+                               }
+                               break;
                        }
                        break;
                }