]> www.infradead.org Git - users/willy/linux.git/commitdiff
Merge remote-tracking branch 'scsi-mkp/for-next'
authorStephen Rothwell <sfr@canb.auug.org.au>
Mon, 10 Dec 2018 06:16:50 +0000 (17:16 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Mon, 10 Dec 2018 06:16:50 +0000 (17:16 +1100)
1  2 
drivers/scsi/lpfc/lpfc_debugfs.c
drivers/scsi/lpfc/lpfc_init.c
drivers/scsi/lpfc/lpfc_scsi.c
drivers/scsi/lpfc/lpfc_sli.c
drivers/scsi/qla2xxx/qla_os.c
drivers/scsi/ufs/ufshcd.c
drivers/target/target_core_pscsi.c
drivers/target/target_core_transport.c

Simple merge
Simple merge
Simple merge
Simple merge
index f92196ec54894d3363749010405c23e07c139c8a,643cd7c0efc1f6a27b77df6a8f58b9020f061bcf..63c47bc7ae59d2041d16baf7750895c09bd5290e
@@@ -1742,6 -1746,41 +1742,49 @@@ qla2x00_loop_reset(scsi_qla_host_t *vha
        return QLA_SUCCESS;
  }
  
 -                      qla2xxx_eh_abort(GET_CMD_SP(sp));
+ 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);
++                      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)
  {
Simple merge
Simple merge
index c9fb988dcd84b16a45f63231650bc0c9eade8dc4,f60b9d1ebb33d7926d3798e2aca353dd614dfbd4..65a18197c5c1e5c0539a686740536d3fe735ef76
@@@ -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: