scsi: introduce a quirk for false cache reporting
Some SATA to USB bridges fail to cooperate with some drives resulting in no cache being present being reported to the host. That causes the host to skip sending a command to synchronize caches. That causes data loss when the drive is powered down. Signed-off-by: Oliver Neukum <oneukum@suse.com> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Acked-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
6406c3d226
commit
050bc4e846
@@ -296,6 +296,14 @@ static int slave_configure(struct scsi_device *sdev)
|
||||
if (us->fflags & US_FL_BROKEN_FUA)
|
||||
sdev->broken_fua = 1;
|
||||
|
||||
/* Some even totally fail to indicate a cache */
|
||||
if (us->fflags & US_FL_ALWAYS_SYNC) {
|
||||
/* don't read caching information */
|
||||
sdev->skip_ms_page_8 = 1;
|
||||
sdev->skip_ms_page_3f = 1;
|
||||
/* assume sync is needed */
|
||||
sdev->wce_default_on = 1;
|
||||
}
|
||||
} else {
|
||||
|
||||
/*
|
||||
|
@@ -338,6 +338,13 @@ UNUSUAL_DEV( 0x046b, 0xff40, 0x0100, 0x0100,
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NO_WP_DETECT),
|
||||
|
||||
/* Reported by Egbert Eich <eich@suse.com> */
|
||||
UNUSUAL_DEV( 0x0480, 0xd010, 0x0100, 0x9999,
|
||||
"Toshiba",
|
||||
"External USB 3.0",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_ALWAYS_SYNC),
|
||||
|
||||
/* Patch submitted by Philipp Friedrich <philipp@void.at> */
|
||||
UNUSUAL_DEV( 0x0482, 0x0100, 0x0100, 0x0100,
|
||||
"Kyocera",
|
||||
|
@@ -498,7 +498,8 @@ void usb_stor_adjust_quirks(struct usb_device *udev, unsigned long *fflags)
|
||||
US_FL_NO_READ_DISC_INFO | US_FL_NO_READ_CAPACITY_16 |
|
||||
US_FL_INITIAL_READ10 | US_FL_WRITE_CACHE |
|
||||
US_FL_NO_ATA_1X | US_FL_NO_REPORT_OPCODES |
|
||||
US_FL_MAX_SECTORS_240 | US_FL_NO_REPORT_LUNS);
|
||||
US_FL_MAX_SECTORS_240 | US_FL_NO_REPORT_LUNS |
|
||||
US_FL_ALWAYS_SYNC);
|
||||
|
||||
p = quirks;
|
||||
while (*p) {
|
||||
@@ -581,6 +582,9 @@ void usb_stor_adjust_quirks(struct usb_device *udev, unsigned long *fflags)
|
||||
case 'w':
|
||||
f |= US_FL_NO_WP_DETECT;
|
||||
break;
|
||||
case 'y':
|
||||
f |= US_FL_ALWAYS_SYNC;
|
||||
break;
|
||||
/* Ignore unrecognized flag characters */
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user