|
@@ -1888,7 +1888,7 @@ nvme_fc_start_fcp_op(struct nvme_fc_ctrl *ctrl, struct nvme_fc_queue *queue,
|
|
|
* the target device is present
|
|
|
*/
|
|
|
if (ctrl->rport->remoteport.port_state != FC_OBJSTATE_ONLINE)
|
|
|
- return BLK_STS_IOERR;
|
|
|
+ goto busy;
|
|
|
|
|
|
if (!nvme_fc_ctrl_get(ctrl))
|
|
|
return BLK_STS_IOERR;
|
|
@@ -1958,22 +1958,25 @@ nvme_fc_start_fcp_op(struct nvme_fc_ctrl *ctrl, struct nvme_fc_queue *queue,
|
|
|
queue->lldd_handle, &op->fcp_req);
|
|
|
|
|
|
if (ret) {
|
|
|
- if (op->rq) /* normal request */
|
|
|
+ if (!(op->flags & FCOP_FLAGS_AEN))
|
|
|
nvme_fc_unmap_data(ctrl, op->rq, op);
|
|
|
- /* else - aen. no cleanup needed */
|
|
|
|
|
|
nvme_fc_ctrl_put(ctrl);
|
|
|
|
|
|
- if (ret != -EBUSY)
|
|
|
+ if (ctrl->rport->remoteport.port_state == FC_OBJSTATE_ONLINE &&
|
|
|
+ ret != -EBUSY)
|
|
|
return BLK_STS_IOERR;
|
|
|
|
|
|
- if (op->rq)
|
|
|
- blk_mq_delay_run_hw_queue(queue->hctx, NVMEFC_QUEUE_DELAY);
|
|
|
-
|
|
|
- return BLK_STS_RESOURCE;
|
|
|
+ goto busy;
|
|
|
}
|
|
|
|
|
|
return BLK_STS_OK;
|
|
|
+
|
|
|
+busy:
|
|
|
+ if (!(op->flags & FCOP_FLAGS_AEN) && queue->hctx)
|
|
|
+ blk_mq_delay_run_hw_queue(queue->hctx, NVMEFC_QUEUE_DELAY);
|
|
|
+
|
|
|
+ return BLK_STS_RESOURCE;
|
|
|
}
|
|
|
|
|
|
static blk_status_t
|