Skip to contentSkip to conversation

SCSI:sd:error handling in sd_sync_cache()

PATCH New Oliver Neukum 1 participant 1 message Nov 5, 2010 SCSI

lore
Share & tools
lore
#0 lore raw

PATCH 2/3 SCSI:sd:error handling in sd_sync_cache()

Quoted 1 line

From 2ab03ae46d6dc126a51ee9cd38206fbdc8bf6a34 Mon Sep 17 00:00:00 2001

From: Oliver Neukum <[email protected]>
Date: Mon, 25 Oct 2010 12:25:26 +0200
Subject: [PATCH 2/3] SCSI:sd:error handling in sd_sync_cache()

The SCSI commands sd_sync_cache() uses may fail. These errors needs to be evaluated to return correct error codes. This fixes system suspension while a device removal is being handled.

---
 drivers/scsi/sd.c |   28 ++++++++++++++++++++++++----
 1 files changed, 24 insertions(+), 4 deletions(-)
drivers/scsi/sd.c +24 -4
index fcba7d2..5ed75bf 100644
@@ -1104,11 +1104,31 @@ static int sd_sync_cache(struct scsi_disk *sdkp)
 		sd_print_result(sdkp, res);
 		if (driver_byte(res) & DRIVER_SENSE)
 			sd_print_sense_hdr(sdkp, &sshdr);
-	}
 
-	if (res)
-		return -EIO;
-	return 0;
+		/* we need to evaluate the error return  */
+		if ((scsi_sense_valid(&sshdr) &&
+			/* 0x3a is medium not present */
+			sshdr.asc == 0x3a))
+			/* this is no error here */
+			return 0;
+
+		switch (host_byte(res)) {
+		/* ignore errors due to racing a disconnection */
+		case DID_BAD_TARGET:
+		case DID_NO_CONNECT:	
+			return 0;
+		/* signal the upper layer it might try again */
+		case DID_BUS_BUSY:
+		case DID_IMM_RETRY:
+		case DID_REQUEUE:
+		case DID_SOFT_ERROR:
+			return -EBUSY;
+		default:
+			return -EIO;
+		}
+	} else {
+		return 0;
+	}
 }
 
 static void sd_rescan(struct device *dev)
Signature · 1 line
1.7.1