From: Jens Axboe Date: Fri, 17 Feb 2017 21:08:19 +0000 (-0700) Subject: Merge branch 'for-4.11/next' into for-4.11/linus-merge X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=818551e2b2c662a1b26de6b4f7d6b8411a838d18;p=openwrt%2Fstaging%2Fblogic.git Merge branch 'for-4.11/next' into for-4.11/linus-merge Signed-off-by: Jens Axboe --- 818551e2b2c662a1b26de6b4f7d6b8411a838d18 diff --cc drivers/scsi/mpt3sas/mpt3sas_scsih.c index 0b5b423b1db0,75f3fce1c867..c6d550551504 --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c @@@ -4717,20 -4715,6 +4717,20 @@@ _scsih_io_done(struct MPT3SAS_ADAPTER * } 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 && ++ if (unlikely(!blk_rq_is_passthrough(scmd->request) && 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);