During ALUA state transitions the device might return
a sense code 02/04/0a (Logical unit not accessible, asymmetric
access state transition). As this is a transient error
we should just retry the READ CAPACITY call until
the state transition finishes and the correct
capacity can be returned.

Signed-off-by: Hannes Reinecke <h...@suse.de>
---
 drivers/scsi/sd.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 37daf9a..b4647f5 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -2333,6 +2333,11 @@ static int read_capacity_16(struct scsi_disk *sdkp, 
struct scsi_device *sdp,
                                 * give it one more chance */
                                if (--reset_retries > 0)
                                        continue;
+                       if (sense_valid &&
+                           sshdr.sense_key == NOT_READY &&
+                           sshdr.asc == 0x04 && sshdr.ascq == 0x0A)
+                               /* ALUA state transition; always retry */
+                               continue;
                }
                retries--;
 
@@ -2418,6 +2423,11 @@ static int read_capacity_10(struct scsi_disk *sdkp, 
struct scsi_device *sdp,
                                 * give it one more chance */
                                if (--reset_retries > 0)
                                        continue;
+                       if (sense_valid &&
+                           sshdr.sense_key == NOT_READY &&
+                           sshdr.asc == 0x04 && sshdr.ascq == 0x0A)
+                               /* ALUA state transition; always retry */
+                               continue;
                }
                retries--;
 
-- 
1.8.5.6

Reply via email to