From 3c4925e8da4f51559f19166b16200af3ee297aa9 Mon Sep 17 00:00:00 2001 From: Felipe Franciosi Date: Sat, 25 Nov 2017 16:59:00 +0000 Subject: [PATCH] pdu: Introduce iscsi_cancel_pdus() Introduce a helper exported from lib/pdu.c which cancels all pdus for a given context. This patch eliminates repeated code from various other files which have the same purpose. The only functional difference is that the cancellation done from iscsi-command.c was (incorrectly) not checking for iscsi->is_loggedin before issuing callbacks. Signed-off-by: Felipe Franciosi --- include/iscsi-private.h | 1 + lib/connect.c | 25 +------------------------ lib/init.c | 24 +----------------------- lib/iscsi-command.c | 19 +------------------ lib/pdu.c | 29 +++++++++++++++++++++++++++++ 5 files changed, 33 insertions(+), 65 deletions(-) diff --git a/include/iscsi-private.h b/include/iscsi-private.h index aedbbe0..218cf74 100644 --- a/include/iscsi-private.h +++ b/include/iscsi-private.h @@ -284,6 +284,7 @@ void iscsi_pdu_set_itt(struct iscsi_pdu *pdu, uint32_t itt); void iscsi_pdu_set_ritt(struct iscsi_pdu *pdu, uint32_t ritt); void iscsi_pdu_set_datasn(struct iscsi_pdu *pdu, uint32_t datasn); void iscsi_pdu_set_bufferoffset(struct iscsi_pdu *pdu, uint32_t bufferoffset); +void iscsi_cancel_pdus(struct iscsi_context *iscsi); int iscsi_pdu_add_data(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, unsigned char *dptr, int dsize); int iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu); diff --git a/lib/connect.c b/lib/connect.c index 4043f7c..d13cc62 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -270,34 +270,11 @@ void iscsi_set_reconnect_max_retries(struct iscsi_context *iscsi, int count) void iscsi_defer_reconnect(struct iscsi_context *iscsi) { - struct iscsi_pdu *pdu; - iscsi->reconnect_deferred = 1; ISCSI_LOG(iscsi, 2, "reconnect deferred, cancelling all tasks"); - while ((pdu = iscsi->outqueue)) { - ISCSI_LIST_REMOVE(&iscsi->outqueue, pdu); - if (iscsi->is_loggedin && pdu->callback) { - /* If an error happened during connect/login, - we don't want to call any of the callbacks. - */ - pdu->callback(iscsi, SCSI_STATUS_CANCELLED, - NULL, pdu->private_data); - } - iscsi->drv->free_pdu(iscsi, pdu); - } - while ((pdu = iscsi->waitpdu)) { - ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - if (iscsi->is_loggedin && pdu->callback) { - /* If an error happened during connect/login, - we don't want to call any of the callbacks. - */ - pdu->callback(iscsi, SCSI_STATUS_CANCELLED, - NULL, pdu->private_data); - } - iscsi->drv->free_pdu(iscsi, pdu); - } + iscsi_cancel_pdus(iscsi); } void iscsi_reconnect_cb(struct iscsi_context *iscsi _U_, int status, diff --git a/lib/init.c b/lib/init.c index 34a95a5..0bcf1b7 100644 --- a/lib/init.c +++ b/lib/init.c @@ -338,7 +338,6 @@ iscsi_set_targetname(struct iscsi_context *iscsi, const char *target_name) int iscsi_destroy_context(struct iscsi_context *iscsi) { - struct iscsi_pdu *pdu; int i; if (iscsi == NULL) { @@ -349,28 +348,7 @@ iscsi_destroy_context(struct iscsi_context *iscsi) iscsi_disconnect(iscsi); } - while ((pdu = iscsi->outqueue)) { - ISCSI_LIST_REMOVE(&iscsi->outqueue, pdu); - if (iscsi->is_loggedin && pdu->callback) { - /* If an error happened during connect/login, we don't want to - call any of the callbacks. - */ - pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, - pdu->private_data); - } - iscsi->drv->free_pdu(iscsi, pdu); - } - while ((pdu = iscsi->waitpdu)) { - ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - if (iscsi->is_loggedin && pdu->callback) { - /* If an error happened during connect/login, we don't want to - call any of the callbacks. - */ - pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, - pdu->private_data); - } - iscsi->drv->free_pdu(iscsi, pdu); - } + iscsi_cancel_pdus(iscsi); if (iscsi->outqueue_current != NULL && iscsi->outqueue_current->flags & ISCSI_PDU_DELETE_WHEN_SENT) { iscsi->drv->free_pdu(iscsi, iscsi->outqueue_current); diff --git a/lib/iscsi-command.c b/lib/iscsi-command.c index 5be7ee2..8b6859a 100644 --- a/lib/iscsi-command.c +++ b/lib/iscsi-command.c @@ -2697,22 +2697,5 @@ iscsi_scsi_cancel_task(struct iscsi_context *iscsi, void iscsi_scsi_cancel_all_tasks(struct iscsi_context *iscsi) { - struct iscsi_pdu *pdu; - - while ((pdu = iscsi->waitpdu)) { - ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - if (pdu->callback) { - pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, - pdu->private_data); - } - iscsi->drv->free_pdu(iscsi, pdu); - } - while ((pdu = iscsi->outqueue)) { - ISCSI_LIST_REMOVE(&iscsi->outqueue, pdu); - if (pdu->callback) { - pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, - pdu->private_data); - } - iscsi->drv->free_pdu(iscsi, pdu); - } + iscsi_cancel_pdus(iscsi); } diff --git a/lib/pdu.c b/lib/pdu.c index 789d412..441efa7 100644 --- a/lib/pdu.c +++ b/lib/pdu.c @@ -768,3 +768,32 @@ iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) { return iscsi->drv->queue_pdu(iscsi, pdu); } + +void +iscsi_cancel_pdus(struct iscsi_context *iscsi) +{ + struct iscsi_pdu *pdu; + + while ((pdu = iscsi->outqueue)) { + ISCSI_LIST_REMOVE(&iscsi->outqueue, pdu); + if (iscsi->is_loggedin && pdu->callback) { + /* If an error happened during connect/login, + we don't want to call any of the callbacks. + */ + pdu->callback(iscsi, SCSI_STATUS_CANCELLED, + NULL, pdu->private_data); + } + iscsi->drv->free_pdu(iscsi, pdu); + } + while ((pdu = iscsi->waitpdu)) { + ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); + if (iscsi->is_loggedin && pdu->callback) { + /* If an error happened during connect/login, + we don't want to call any of the callbacks. + */ + pdu->callback(iscsi, SCSI_STATUS_CANCELLED, + NULL, pdu->private_data); + } + iscsi->drv->free_pdu(iscsi, pdu); + } +}