From: Bart Van Assche <bart.vanassche@xxxxxxxxxxx> Commit f2e767bb5d6e ("mpt3sas: Force request partial completion alignment") introduced a forced alignment of resid to the device logical block size to fix bogus HBA firmware sometimes returning an unaligned value. This fix however did not consider the case of commands not operating on logical block size units (e.g. REQ_OP_ZONE_REPORT and its 64B aligned partial replies). This could result is incorrectly aligning resid for these commands, which for REQ_OP_REPORT_ZONES result in the inability to determine the number of zone descriptors returned. Fix the resid alignment check to exclude all requests that are not medium access requests using blk_rq_access_medium(). This will exclude from the resid forced fix all passthrough requests as well as zone command requests. Fixes: f2e767bb5d6e ("mpt3sas: Force request partial completion alignment") Signed-off-by: Bart Van Assche <bart.vanassche@xxxxxxxxxxx> --- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c index 46e866c..405dc84 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c @@ -4748,8 +4748,8 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply) * then scsi-ml does not need to handle this misbehavior. */ sector_sz = scmd->device->sector_size; - if (unlikely(!blk_rq_is_passthrough(scmd->request) && sector_sz && - xfer_cnt % sector_sz)) { + if (unlikely(sector_sz && (xfer_cnt & (sector_sz - 1)) && + blk_rq_accesses_medium(scmd->request))) { sdev_printk(KERN_INFO, scmd->device, "unaligned partial completion avoided (xfer_cnt=%u, sector_sz=%u)\n", xfer_cnt, sector_sz); -- 2.9.3