SCSI:sd:error handling in sd_sync_cache()
PATCH 2/3 SCSI:sd:error handling in sd_sync_cache()
Quoted 1 line
From
2ab03ae46d6dc126a51ee9cd38206fbdc8bf6a34Mon 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.
Signed-off-by Oliver NEukum <[email protected]>
--- drivers/scsi/sd.c | 28 ++++++++++++++++++++++++---- 1 files changed, 24 insertions(+), 4 deletions(-)
drivers/scsi/sd.c +24 -4
@@ -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