Bläddra i källkod

SCSI Initiator: check sense key before failing

There is no need to fail a read when the drive reports RECOVERED_ERROR.
Petteri Aimonen 10 månader sedan
förälder
incheckning
8f0b8cf31f
2 ändrade filer med 56 tillägg och 5 borttagningar
  1. 30 1
      src/ZuluSCSI_initiator.cpp
  2. 26 4
      src/ZuluSCSI_msc_initiator.cpp

+ 30 - 1
src/ZuluSCSI_initiator.cpp

@@ -1033,7 +1033,36 @@ bool scsiInitiatorReadDataToFile(int target_id, uint32_t start_sector, uint32_t
 
     scsiHostPhyRelease();
 
-    return status == 0 && g_initiator_transfer.all_ok;
+    if (!g_initiator_transfer.all_ok)
+    {
+        dbgmsg("scsiInitiatorReadDataToFile: Incomplete transfer");
+        return false;
+    }
+    else if (status == 2)
+    {
+        uint8_t sense_key;
+        scsiRequestSense(target_id, &sense_key);
+
+        if (sense_key == RECOVERED_ERROR)
+        {
+            dbgmsg("scsiInitiatorReadDataToFile: RECOVERED_ERROR at ", (int)start_sector);
+            return true;
+        }
+        else if (sense_key == UNIT_ATTENTION)
+        {
+            dbgmsg("scsiInitiatorReadDataToFile: UNIT_ATTENTION");
+            return true;
+        }
+        else
+        {
+            logmsg("scsiInitiatorReadDataToFile: READ failed: ", status, " sense key ", sense_key);
+            return false;
+        }
+    }
+    else
+    {
+        return status == 0;
+    }
 }
 
 

+ 26 - 4
src/ZuluSCSI_msc_initiator.cpp

@@ -494,8 +494,19 @@ int32_t init_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buf
         uint8_t sense_key;
         scsiRequestSense(target_id, &sense_key);
 
-        logmsg("SCSI Initiator read failed: ", status, " sense key ", sense_key);
-        return -1;
+        if (sense_key == RECOVERED_ERROR)
+        {
+            dbgmsg("SCSI Initiator read: RECOVERED_ERROR at ", (int)orig_lba);
+        }
+        else if (sense_key == UNIT_ATTENTION)
+        {
+            dbgmsg("SCSI Initiator read: UNIT_ATTENTION");
+        }
+        else
+        {
+            logmsg("SCSI Initiator read failed: ", status, " sense key ", sense_key);
+            return -1;
+        }
     }
 
     if (lba + total_sectorcount <= g_msc_initiator_targets[lun].sectorcount)
@@ -576,8 +587,19 @@ int32_t init_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t
         uint8_t sense_key;
         scsiRequestSense(target_id, &sense_key);
 
-        logmsg("SCSI Initiator write failed: ", status, " sense key ", sense_key);
-        return -1;
+        if (sense_key == RECOVERED_ERROR)
+        {
+            dbgmsg("SCSI Initiator write: RECOVERED_ERROR at ", (int)start_sector);
+        }
+        else if (sense_key == UNIT_ATTENTION)
+        {
+            dbgmsg("SCSI Initiator write: UNIT_ATTENTION");
+        }
+        else
+        {
+            logmsg("SCSI Initiator write failed: ", status, " sense key ", sense_key);
+            return -1;
+        }
     }
 
     return sectorcount * sectorsize;