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 <felipe@nutanix.com>
This commit is contained in:
Felipe Franciosi
2017-11-25 16:59:00 +00:00
parent 5aafc29991
commit 3c4925e8da
5 changed files with 33 additions and 65 deletions
+1
View File
@@ -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_ritt(struct iscsi_pdu *pdu, uint32_t ritt);
void iscsi_pdu_set_datasn(struct iscsi_pdu *pdu, uint32_t datasn); 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_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, int iscsi_pdu_add_data(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
unsigned char *dptr, int dsize); unsigned char *dptr, int dsize);
int iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu); int iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu);
+1 -24
View File
@@ -270,34 +270,11 @@ void iscsi_set_reconnect_max_retries(struct iscsi_context *iscsi, int count)
void iscsi_defer_reconnect(struct iscsi_context *iscsi) void iscsi_defer_reconnect(struct iscsi_context *iscsi)
{ {
struct iscsi_pdu *pdu;
iscsi->reconnect_deferred = 1; iscsi->reconnect_deferred = 1;
ISCSI_LOG(iscsi, 2, "reconnect deferred, cancelling all tasks"); ISCSI_LOG(iscsi, 2, "reconnect deferred, cancelling all tasks");
while ((pdu = iscsi->outqueue)) { iscsi_cancel_pdus(iscsi);
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);
}
} }
void iscsi_reconnect_cb(struct iscsi_context *iscsi _U_, int status, void iscsi_reconnect_cb(struct iscsi_context *iscsi _U_, int status,
+1 -23
View File
@@ -338,7 +338,6 @@ iscsi_set_targetname(struct iscsi_context *iscsi, const char *target_name)
int int
iscsi_destroy_context(struct iscsi_context *iscsi) iscsi_destroy_context(struct iscsi_context *iscsi)
{ {
struct iscsi_pdu *pdu;
int i; int i;
if (iscsi == NULL) { if (iscsi == NULL) {
@@ -349,28 +348,7 @@ iscsi_destroy_context(struct iscsi_context *iscsi)
iscsi_disconnect(iscsi); iscsi_disconnect(iscsi);
} }
while ((pdu = iscsi->outqueue)) { iscsi_cancel_pdus(iscsi);
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);
}
if (iscsi->outqueue_current != NULL && iscsi->outqueue_current->flags & ISCSI_PDU_DELETE_WHEN_SENT) { if (iscsi->outqueue_current != NULL && iscsi->outqueue_current->flags & ISCSI_PDU_DELETE_WHEN_SENT) {
iscsi->drv->free_pdu(iscsi, iscsi->outqueue_current); iscsi->drv->free_pdu(iscsi, iscsi->outqueue_current);
+1 -18
View File
@@ -2697,22 +2697,5 @@ iscsi_scsi_cancel_task(struct iscsi_context *iscsi,
void void
iscsi_scsi_cancel_all_tasks(struct iscsi_context *iscsi) iscsi_scsi_cancel_all_tasks(struct iscsi_context *iscsi)
{ {
struct iscsi_pdu *pdu; iscsi_cancel_pdus(iscsi);
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);
}
} }
+29
View File
@@ -768,3 +768,32 @@ iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
{ {
return iscsi->drv->queue_pdu(iscsi, 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);
}
}