|
@@ -87,6 +87,7 @@ struct nvmet_fc_fcp_iod {
|
|
|
struct nvmet_req req;
|
|
|
struct work_struct work;
|
|
|
struct work_struct done_work;
|
|
|
+ struct work_struct defer_work;
|
|
|
|
|
|
struct nvmet_fc_tgtport *tgtport;
|
|
|
struct nvmet_fc_tgt_queue *queue;
|
|
@@ -224,6 +225,7 @@ static DEFINE_IDA(nvmet_fc_tgtport_cnt);
|
|
|
static void nvmet_fc_handle_ls_rqst_work(struct work_struct *work);
|
|
|
static void nvmet_fc_handle_fcp_rqst_work(struct work_struct *work);
|
|
|
static void nvmet_fc_fcp_rqst_op_done_work(struct work_struct *work);
|
|
|
+static void nvmet_fc_fcp_rqst_op_defer_work(struct work_struct *work);
|
|
|
static void nvmet_fc_tgt_a_put(struct nvmet_fc_tgt_assoc *assoc);
|
|
|
static int nvmet_fc_tgt_a_get(struct nvmet_fc_tgt_assoc *assoc);
|
|
|
static void nvmet_fc_tgt_q_put(struct nvmet_fc_tgt_queue *queue);
|
|
@@ -429,6 +431,7 @@ nvmet_fc_prep_fcp_iodlist(struct nvmet_fc_tgtport *tgtport,
|
|
|
for (i = 0; i < queue->sqsize; fod++, i++) {
|
|
|
INIT_WORK(&fod->work, nvmet_fc_handle_fcp_rqst_work);
|
|
|
INIT_WORK(&fod->done_work, nvmet_fc_fcp_rqst_op_done_work);
|
|
|
+ INIT_WORK(&fod->defer_work, nvmet_fc_fcp_rqst_op_defer_work);
|
|
|
fod->tgtport = tgtport;
|
|
|
fod->queue = queue;
|
|
|
fod->active = false;
|
|
@@ -511,6 +514,17 @@ nvmet_fc_queue_fcp_req(struct nvmet_fc_tgtport *tgtport,
|
|
|
nvmet_fc_handle_fcp_rqst(tgtport, fod);
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+nvmet_fc_fcp_rqst_op_defer_work(struct work_struct *work)
|
|
|
+{
|
|
|
+ struct nvmet_fc_fcp_iod *fod =
|
|
|
+ container_of(work, struct nvmet_fc_fcp_iod, defer_work);
|
|
|
+
|
|
|
+ /* Submit deferred IO for processing */
|
|
|
+ nvmet_fc_queue_fcp_req(fod->tgtport, fod->queue, fod->fcpreq);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
static void
|
|
|
nvmet_fc_free_fcp_iod(struct nvmet_fc_tgt_queue *queue,
|
|
|
struct nvmet_fc_fcp_iod *fod)
|
|
@@ -568,13 +582,12 @@ nvmet_fc_free_fcp_iod(struct nvmet_fc_tgt_queue *queue,
|
|
|
/* inform LLDD IO is now being processed */
|
|
|
tgtport->ops->defer_rcv(&tgtport->fc_target_port, fcpreq);
|
|
|
|
|
|
- /* Submit deferred IO for processing */
|
|
|
- nvmet_fc_queue_fcp_req(tgtport, queue, fcpreq);
|
|
|
-
|
|
|
/*
|
|
|
* Leave the queue lookup get reference taken when
|
|
|
* fod was originally allocated.
|
|
|
*/
|
|
|
+
|
|
|
+ queue_work(queue->work_q, &fod->defer_work);
|
|
|
}
|
|
|
|
|
|
static int
|