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:
James Smart 2016-12-24 09:46:43 -08:00 committed by Sagi Grimberg
parent d61b7f972d
commit c81e55e057

View File

@ -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 */