@@ -1020,6 +1020,9 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,
if (*bflags & BLIST_NO_RSOC)
sdev->no_report_opcodes = 1;
+ if (*bflags & BLIST_BROKEN_FUA)
+ sdev->broken_fua = 1;
+
/* set the device running here so that slave configure
* may do I/O */
mutex_lock(&sdev->state_mutex);
@@ -68,6 +68,8 @@
#define BLIST_RETRY_ITF ((__force blist_flags_t)(1ULL << 32))
/* Always retry ABORTED_COMMAND with ASC 0xc1 */
#define BLIST_RETRY_ASC_C1 ((__force blist_flags_t)(1ULL << 33))
+/* Use SYNCHRONIZE CACHE instead of FUA */
+#define BLIST_BROKEN_FUA ((__force blist_flags_t)(1ULL << 34))
#define __BLIST_LAST_USED BLIST_RETRY_ASC_C1
UFS devices perform better when using SYNCHRONIZE CACHE command instead of the FUA flag. Introduce the BLIST_BROKEN_FUA flag for using SYNCHRONIZE CACHE instead of FUA. The BLIST_BROKEN_FUA flag can be set by using one of the following approaches: * From user space, by writing into /proc/scsi/device_info. * From the kernel, by setting sdev_bflags from the slave_alloc callback. For a prior version of this patch, see also https://lore.kernel.org/lkml/YpecaXfIxZBHIcfj@google.com/T/ Cc: Jaegeuk Kim <jaegeuk@kernel.org> Cc: Asutosh Das <asutoshd@codeaurora.org> Signed-off-by: Bart Van Assche <bvanassche@acm.org> --- drivers/scsi/scsi_scan.c | 3 +++ include/scsi/scsi_devinfo.h | 2 ++ 2 files changed, 5 insertions(+)