[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <1552845068.5940.6.camel@trentalancia.com>
Date: Sun, 17 Mar 2019 18:51:08 +0100
From: Guido Trentalancia <guido@...ntalancia.com>
To: linux-kernel@...r.kernel.org
Subject: [PATCH] scsi: ignore Synchronize Cache command failures to keep
using drives not supporting it
Many obsolete hard drives do not support the Synchronize Cache SCSI
command. Such command is generally issued during fsync() calls which
at the moment therefore fail with the ILLEGAL_REQUEST sense key.
Since this failure is currently treated as critical in the kernel SCSI
disk driver, such obsolete hard drives cannot be used anymore (at least
since kernel 4.10, maybe even earlier): they cannot be formatted,
mounted and/or checked using tools such as e2fsprogs.
Because there is nothing which can be done if the drive does not support
such command, such ILLEGAL_REQUEST should be treated as non-critical so
that the underlying operation does not fail and the obsolete hard drive
can be used normally.
Of course, using such hard drives which do not feature the Synchronize
Cache SCSI command implies a very high risk (or maybe even certainty) of
data loss in case of power cuts, USB cable disconnects and so on -
SO YOU HAVE BEEN WARNED - IN DOUBT, UPGRADE TO A NEWER HARD DRIVE !!!
Signed-off-by: Guido Trentalancia <guido@...ntalancia.com>
---
drivers/scsi/sd.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
--- linux-5.0.2-orig/drivers/scsi/sd.c 2019-03-17 18:22:04.822720851 +0100
+++ linux-5.0.2/drivers/scsi/sd.c 2019-03-17 18:47:06.405881720 +0100
@@ -1633,6 +1633,16 @@ static int sd_sync_cache(struct scsi_dis
}
if (res) {
+ /*
+ * sshdr.sense_key == ILLEGAL_REQUEST means this drive
+ * doesn't support sync. There's not much to do and
+ * sync shouldn't fail.
+ */
+ if (sshdr->sense_key == ILLEGAL_REQUEST && sshdr->asc == 0x20) {
+ sd_printk(KERN_NOTICE, sdkp, "Drive does not support Synchronize Cache(10) command: ignoring.\n");
+ return 0;
+ }
+
sd_print_result(sdkp, "Synchronize Cache(10) failed", res);
if (driver_byte(res) == DRIVER_SENSE)
@@ -2022,6 +2032,13 @@ static int sd_done(struct scsi_cmnd *SCp
req->rq_flags |= RQF_QUIET;
}
break;
+ case SYNCHRONIZE_CACHE:
+ if (sshdr.asc == 0x20) {
+ sd_printk(KERN_NOTICE, sdkp, "Drive does not support Synchronize Cache(10) command: ignoring.\n");
+ SCpnt->result = 0;
+ good_bytes = scsi_bufflen(SCpnt);
+ }
+ break;
}
}
break;
Powered by blists - more mailing lists