Patch "scsi: mpt3sas: Force request partial completion alignment" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
scsi: mpt3sas: Force request partial completion alignment
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
scsi-mpt3sas-force-request-partial-completion-alignment.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
f2e767bb5d6ee0d988cb7d4e54b0b21175802b6bMon Sep 17 00:00:00 2001
From: Ram Pai <[email protected]>
Date: Thu, 26 Jan 2017 16:37:01 -0200
Subject: scsi: mpt3sas: Force request partial completion alignment
From: Ram Pai <[email protected]>
commit f2e767bb5d6ee0d988cb7d4e54b0b21175802b6b upstream.
The firmware or device, possibly under a heavy I/O load, can return on a partial unaligned boundary. Scsi-ml expects these requests to be completed on an alignment boundary. Scsi-ml blindly requeues the I/O without checking the alignment boundary of the I/O request for the remaining bytes. This leads to errors, since devices cannot perform non-aligned read/write operations.
This patch fixes the issue in the driver. It aligns unaligned completions of FS requests, by truncating them to the nearest alignment boundary.
[mkp: simplified if statement]
--- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
drivers/scsi/mpt3sas/mpt3sas_scsih.c +15 -0
@@ -4634,6 +4634,7 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *istruct MPT3SAS_DEVICE *sas_device_priv_data;u32 response_code =0 ;unsigned long flags; +unsigned int sector_sz; mpi_reply =mpt3sas_base_get_reply_virt_addr (ioc, reply); scmd =_scsih_scsi_lookup_get_clear (ioc, smid);
@@ -4692,6 +4693,20 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *i } xfer_cnt =le32_to_cpu (mpi_reply->TransferCount); + +/* In case of bogus fw or device, we could end up having +* unaligned partial completion. We can force alignment here, +* then scsi-ml does not need to handle this misbehavior. +*/ + sector_sz = scmd->device->sector_size; +if (unlikely (scmd->request->cmd_type ==REQ_TYPE_FS && sector_sz && + xfer_cnt % sector_sz)) { +sdev_printk (KERN_INFO , scmd->device, +"unaligned partial completion avoided (xfer_cnt=%u, sector_sz=%u)\n" , + xfer_cnt, sector_sz); + xfer_cnt =round_down (xfer_cnt, sector_sz); + } +scsi_set_resid (scmd,scsi_bufflen (scmd) - xfer_cnt);if (ioc_status &MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE ) log_info =le32_to_cpu (mpi_reply->IOCLogInfo);
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/scsi-mpt3sas-force-request-partial-completion-alignment.patch