Loading drivers/scsi/mpt3sas/mpt3sas_scsih.c +15 −0 Original line number Original line Diff line number Diff line Loading @@ -4657,6 +4657,7 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply) struct MPT3SAS_DEVICE *sas_device_priv_data; struct MPT3SAS_DEVICE *sas_device_priv_data; u32 response_code = 0; u32 response_code = 0; unsigned long flags; unsigned long flags; unsigned int sector_sz; mpi_reply = mpt3sas_base_get_reply_virt_addr(ioc, reply); mpi_reply = mpt3sas_base_get_reply_virt_addr(ioc, reply); scmd = _scsih_scsi_lookup_get_clear(ioc, smid); scmd = _scsih_scsi_lookup_get_clear(ioc, smid); Loading Loading @@ -4715,6 +4716,20 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply) } } xfer_cnt = le32_to_cpu(mpi_reply->TransferCount); 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); scsi_set_resid(scmd, scsi_bufflen(scmd) - xfer_cnt); if (ioc_status & MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) if (ioc_status & MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) log_info = le32_to_cpu(mpi_reply->IOCLogInfo); log_info = le32_to_cpu(mpi_reply->IOCLogInfo); Loading drivers/scsi/qla2xxx/qla_isr.c +2 −1 Original line number Original line Diff line number Diff line Loading @@ -3238,7 +3238,7 @@ qla2x00_free_irqs(scsi_qla_host_t *vha) * from a probe failure context. * from a probe failure context. */ */ if (!ha->rsp_q_map || !ha->rsp_q_map[0]) if (!ha->rsp_q_map || !ha->rsp_q_map[0]) return; goto free_irqs; rsp = ha->rsp_q_map[0]; rsp = ha->rsp_q_map[0]; if (ha->flags.msix_enabled) { if (ha->flags.msix_enabled) { Loading @@ -3258,6 +3258,7 @@ qla2x00_free_irqs(scsi_qla_host_t *vha) free_irq(pci_irq_vector(ha->pdev, 0), rsp); free_irq(pci_irq_vector(ha->pdev, 0), rsp); } } free_irqs: pci_free_irq_vectors(ha->pdev); pci_free_irq_vectors(ha->pdev); } } Loading drivers/scsi/qla2xxx/qla_os.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -1616,7 +1616,7 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res) /* Don't abort commands in adapter during EEH /* Don't abort commands in adapter during EEH * recovery as it's not accessible/responding. * recovery as it's not accessible/responding. */ */ if (!ha->flags.eeh_busy) { if (GET_CMD_SP(sp) && !ha->flags.eeh_busy) { /* Get a reference to the sp and drop the lock. /* Get a reference to the sp and drop the lock. * The reference ensures this sp->done() call * The reference ensures this sp->done() call * - and not the call in qla2xxx_eh_abort() - * - and not the call in qla2xxx_eh_abort() - Loading Loading
drivers/scsi/mpt3sas/mpt3sas_scsih.c +15 −0 Original line number Original line Diff line number Diff line Loading @@ -4657,6 +4657,7 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply) struct MPT3SAS_DEVICE *sas_device_priv_data; struct MPT3SAS_DEVICE *sas_device_priv_data; u32 response_code = 0; u32 response_code = 0; unsigned long flags; unsigned long flags; unsigned int sector_sz; mpi_reply = mpt3sas_base_get_reply_virt_addr(ioc, reply); mpi_reply = mpt3sas_base_get_reply_virt_addr(ioc, reply); scmd = _scsih_scsi_lookup_get_clear(ioc, smid); scmd = _scsih_scsi_lookup_get_clear(ioc, smid); Loading Loading @@ -4715,6 +4716,20 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply) } } xfer_cnt = le32_to_cpu(mpi_reply->TransferCount); 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); scsi_set_resid(scmd, scsi_bufflen(scmd) - xfer_cnt); if (ioc_status & MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) if (ioc_status & MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) log_info = le32_to_cpu(mpi_reply->IOCLogInfo); log_info = le32_to_cpu(mpi_reply->IOCLogInfo); Loading
drivers/scsi/qla2xxx/qla_isr.c +2 −1 Original line number Original line Diff line number Diff line Loading @@ -3238,7 +3238,7 @@ qla2x00_free_irqs(scsi_qla_host_t *vha) * from a probe failure context. * from a probe failure context. */ */ if (!ha->rsp_q_map || !ha->rsp_q_map[0]) if (!ha->rsp_q_map || !ha->rsp_q_map[0]) return; goto free_irqs; rsp = ha->rsp_q_map[0]; rsp = ha->rsp_q_map[0]; if (ha->flags.msix_enabled) { if (ha->flags.msix_enabled) { Loading @@ -3258,6 +3258,7 @@ qla2x00_free_irqs(scsi_qla_host_t *vha) free_irq(pci_irq_vector(ha->pdev, 0), rsp); free_irq(pci_irq_vector(ha->pdev, 0), rsp); } } free_irqs: pci_free_irq_vectors(ha->pdev); pci_free_irq_vectors(ha->pdev); } } Loading
drivers/scsi/qla2xxx/qla_os.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -1616,7 +1616,7 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res) /* Don't abort commands in adapter during EEH /* Don't abort commands in adapter during EEH * recovery as it's not accessible/responding. * recovery as it's not accessible/responding. */ */ if (!ha->flags.eeh_busy) { if (GET_CMD_SP(sp) && !ha->flags.eeh_busy) { /* Get a reference to the sp and drop the lock. /* Get a reference to the sp and drop the lock. * The reference ensures this sp->done() call * The reference ensures this sp->done() call * - and not the call in qla2xxx_eh_abort() - * - and not the call in qla2xxx_eh_abort() - Loading