mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-23 20:53:53 +08:00
nvmet_fc: correct logic in disconnect queue LS handling
Correct logic in disconnect queue LS handling. Rework so that queue searching and error reporting is above the section to send back a ls rjt Signed-off-by: James Smart <james.smart@broadcom.com> Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
This commit is contained in:
parent
d61b7f972d
commit
c81e55e057
@ -1314,7 +1314,7 @@ nvmet_fc_ls_disconnect(struct nvmet_fc_tgtport *tgtport,
|
|||||||
(struct fcnvme_ls_disconnect_rqst *)iod->rqstbuf;
|
(struct fcnvme_ls_disconnect_rqst *)iod->rqstbuf;
|
||||||
struct fcnvme_ls_disconnect_acc *acc =
|
struct fcnvme_ls_disconnect_acc *acc =
|
||||||
(struct fcnvme_ls_disconnect_acc *)iod->rspbuf;
|
(struct fcnvme_ls_disconnect_acc *)iod->rspbuf;
|
||||||
struct nvmet_fc_tgt_queue *queue;
|
struct nvmet_fc_tgt_queue *queue = NULL;
|
||||||
struct nvmet_fc_tgt_assoc *assoc;
|
struct nvmet_fc_tgt_assoc *assoc;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
bool del_assoc = false;
|
bool del_assoc = false;
|
||||||
@ -1348,7 +1348,18 @@ nvmet_fc_ls_disconnect(struct nvmet_fc_tgtport *tgtport,
|
|||||||
assoc = nvmet_fc_find_target_assoc(tgtport,
|
assoc = nvmet_fc_find_target_assoc(tgtport,
|
||||||
be64_to_cpu(rqst->associd.association_id));
|
be64_to_cpu(rqst->associd.association_id));
|
||||||
iod->assoc = assoc;
|
iod->assoc = assoc;
|
||||||
if (!assoc)
|
if (assoc) {
|
||||||
|
if (rqst->discon_cmd.scope ==
|
||||||
|
FCNVME_DISCONN_CONNECTION) {
|
||||||
|
queue = nvmet_fc_find_target_queue(tgtport,
|
||||||
|
be64_to_cpu(
|
||||||
|
rqst->discon_cmd.id));
|
||||||
|
if (!queue) {
|
||||||
|
nvmet_fc_tgt_a_put(assoc);
|
||||||
|
ret = VERR_NO_CONN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
ret = VERR_NO_ASSOC;
|
ret = VERR_NO_ASSOC;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1373,21 +1384,18 @@ nvmet_fc_ls_disconnect(struct nvmet_fc_tgtport *tgtport,
|
|||||||
FCNVME_LS_DISCONNECT);
|
FCNVME_LS_DISCONNECT);
|
||||||
|
|
||||||
|
|
||||||
if (rqst->discon_cmd.scope == FCNVME_DISCONN_CONNECTION) {
|
/* are we to delete a Connection ID (queue) */
|
||||||
queue = nvmet_fc_find_target_queue(tgtport,
|
if (queue) {
|
||||||
be64_to_cpu(rqst->discon_cmd.id));
|
int qid = queue->qid;
|
||||||
if (queue) {
|
|
||||||
int qid = queue->qid;
|
|
||||||
|
|
||||||
nvmet_fc_delete_target_queue(queue);
|
nvmet_fc_delete_target_queue(queue);
|
||||||
|
|
||||||
/* release the get taken by find_target_queue */
|
/* release the get taken by find_target_queue */
|
||||||
nvmet_fc_tgt_q_put(queue);
|
nvmet_fc_tgt_q_put(queue);
|
||||||
|
|
||||||
/* tear association down if io queue terminated */
|
/* tear association down if io queue terminated */
|
||||||
if (!qid)
|
if (!qid)
|
||||||
del_assoc = true;
|
del_assoc = true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* release get taken in nvmet_fc_find_target_assoc */
|
/* release get taken in nvmet_fc_find_target_assoc */
|
||||||
|
Loading…
Reference in New Issue
Block a user