scsi: qla2xxx: Add FC-NVMe abort processing
authorDarren Trapp <darren.trapp@cavium.com>
Wed, 21 Mar 2018 06:09:33 +0000 (23:09 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 21 Mar 2018 22:38:54 +0000 (18:38 -0400)
Signed-off-by: Darren Trapp <darren.trapp@cavium.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_nvme.c
drivers/scsi/qla2xxx/qla_nvme.h

index 5ee447680dddd930f3fd346dcc275bbcf51c9ab6..951fbbab961f619fc0754e1ca384a41c4b08451a 100644 (file)
@@ -181,24 +181,32 @@ static void qla_nvme_sp_done(void *ptr, int res)
        return;
 }
 
-static void qla_nvme_ls_abort(struct nvme_fc_local_port *lport,
-    struct nvme_fc_remote_port *rport, struct nvmefc_ls_req *fd)
+static void qla_nvme_abort_work(struct work_struct *work)
 {
-       struct nvme_private *priv = fd->private;
-       struct qla_nvme_rport *qla_rport = rport->private;
-       fc_port_t *fcport = qla_rport->fcport;
+       struct nvme_private *priv =
+               container_of(work, struct nvme_private, abort_work);
        srb_t *sp = priv->sp;
-       int rval;
+       fc_port_t *fcport = sp->fcport;
        struct qla_hw_data *ha = fcport->vha->hw;
+       int rval;
 
        rval = ha->isp_ops->abort_command(sp);
 
        ql_dbg(ql_dbg_io, fcport->vha, 0x212b,
-           "%s: %s LS command for sp=%p on fcport=%p rval=%x\n", __func__,
+           "%s: %s command for sp=%p on fcport=%p rval=%x\n", __func__,
            (rval != QLA_SUCCESS) ? "Failed to abort" : "Aborted",
            sp, fcport, rval);
 }
 
+static void qla_nvme_ls_abort(struct nvme_fc_local_port *lport,
+    struct nvme_fc_remote_port *rport, struct nvmefc_ls_req *fd)
+{
+       struct nvme_private *priv = fd->private;
+
+       INIT_WORK(&priv->abort_work, qla_nvme_abort_work);
+       schedule_work(&priv->abort_work);
+}
+
 static void qla_nvme_ls_complete(struct work_struct *work)
 {
        struct nvme_private *priv =
@@ -264,18 +272,9 @@ static void qla_nvme_fcp_abort(struct nvme_fc_local_port *lport,
     struct nvmefc_fcp_req *fd)
 {
        struct nvme_private *priv = fd->private;
-       srb_t *sp = priv->sp;
-       int rval;
-       struct qla_nvme_rport *qla_rport = rport->private;
-       fc_port_t *fcport = qla_rport->fcport;
-       struct qla_hw_data *ha = fcport->vha->hw;
-
-       rval = ha->isp_ops->abort_command(sp);
 
-       ql_dbg(ql_dbg_io, fcport->vha, 0x2127,
-           "%s: %s command for sp=%p on fcport=%p rval=%x\n", __func__,
-           (rval != QLA_SUCCESS) ? "Failed to abort" : "Aborted",
-           sp, fcport, rval);
+       INIT_WORK(&priv->abort_work, qla_nvme_abort_work);
+       schedule_work(&priv->abort_work);
 }
 
 static void qla_nvme_poll(struct nvme_fc_local_port *lport, void *hw_queue_handle)
@@ -650,6 +649,7 @@ void qla_nvme_delete(struct scsi_qla_host *vha)
                ql_log(ql_log_info, fcport->vha, 0x2114, "%s: fcport=%p\n",
                    __func__, fcport);
 
+               nvme_fc_set_remoteport_devloss(fcport->nvme_remote_port, 0);
                init_completion(&fcport->nvme_del_done);
                nvme_fc_unregister_remoteport(fcport->nvme_remote_port);
                wait_for_completion(&fcport->nvme_del_done);
index 7becfc1b3e69838ba5233be15418a9ebd74f95a3..8df379478269639de175b78779f66e5a0d46ace0 100644 (file)
@@ -31,6 +31,7 @@ struct nvme_private {
        struct srb      *sp;
        struct nvmefc_ls_req *fd;
        struct work_struct ls_work;
+       struct work_struct abort_work;
        int comp_status;
 };