From: Stephen Rothwell Date: Mon, 10 Dec 2018 06:16:50 +0000 (+1100) Subject: Merge remote-tracking branch 'scsi-mkp/for-next' X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=1488ffc5e9d363961560b7cc93d04ad8a6653ec5;p=users%2Fwilly%2Flinux.git Merge remote-tracking branch 'scsi-mkp/for-next' --- 1488ffc5e9d363961560b7cc93d04ad8a6653ec5 diff --cc drivers/scsi/qla2xxx/qla_os.c index f92196ec5489,643cd7c0efc1..63c47bc7ae59 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@@ -1742,6 -1746,41 +1742,49 @@@ qla2x00_loop_reset(scsi_qla_host_t *vha return QLA_SUCCESS; } + static void qla2x00_abort_srb(struct qla_qpair *qp, srb_t *sp, const int res, + unsigned long *flags) + __releases(qp->qp_lock_ptr) + __acquires(qp->qp_lock_ptr) + { + scsi_qla_host_t *vha = qp->vha; + struct qla_hw_data *ha = vha->hw; + + if (sp->type == SRB_NVME_CMD || sp->type == SRB_NVME_LS) { + if (!sp_get(sp)) { + /* got sp */ + spin_unlock_irqrestore(qp->qp_lock_ptr, *flags); + qla_nvme_abort(ha, sp, res); + spin_lock_irqsave(qp->qp_lock_ptr, *flags); + } + } else if (GET_CMD_SP(sp) && !ha->flags.eeh_busy && + !test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags) && + !qla2x00_isp_reg_stat(ha) && sp->type == SRB_SCSI_CMD) { + /* + * Don't abort commands in adapter during EEH recovery as it's + * not accessible/responding. + * + * Get a reference to the sp and drop the lock. The reference + * ensures this sp->done() call and not the call in + * qla2xxx_eh_abort() ends the SCSI cmd (with result 'res'). + */ + if (!sp_get(sp)) { ++ int status; ++ + spin_unlock_irqrestore(qp->qp_lock_ptr, *flags); - qla2xxx_eh_abort(GET_CMD_SP(sp)); ++ status = qla2xxx_eh_abort(GET_CMD_SP(sp)); + spin_lock_irqsave(qp->qp_lock_ptr, *flags); ++ /* ++ * Get rid of extra reference causedby early ++ * exit from qla2xxx_eh_abort ++ */ ++ if (status == FAST_IO_FAIL) ++ atomic_dec(&sp->ref_count); + } + } + sp->done(sp, res); + } + static void __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res) { diff --cc drivers/target/target_core_transport.c index c9fb988dcd84,f60b9d1ebb33..65a18197c5c1 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c @@@ -1790,10 -1831,13 +1831,13 @@@ void transport_generic_request_failure( transport_complete_task_attr(cmd); if (cmd->transport_complete_callback) - cmd->transport_complete_callback(cmd, false, NULL); + cmd->transport_complete_callback(cmd, false, &post_ret); - if (transport_check_aborted_status(cmd, 1)) + if (cmd->transport_state & CMD_T_ABORTED) { + INIT_WORK(&cmd->work, target_abort_work); + queue_work(target_completion_wq, &cmd->work); return; + } switch (sense_reason) { case TCM_NON_EXISTENT_LUN: