Skip to content

Commit

Permalink
checking if task is in outqueue
Browse files Browse the repository at this point in the history
Users need to check if a task is queued to send (not sent yet)
before invoking functions such as iscsi_task_mgmt_abort_task_async.
Otherwise, because task management requests are automatically
treated as "immediate", a request to abort a task is sent before
the task itself.

if (iscsi_scsi_is_task_in_outqueue(iscsi_, task_)) {
    iscsi_scsi_cancel_task(iscsi_, task_);
} else {
    iscsi_task_mgmt_abort_task_async(iscsi_, task_, AbortCb, context_);
}
  • Loading branch information
anatoliy-glagolev committed Sep 20, 2023
1 parent 75a46d2 commit e4c4799
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 0 deletions.
7 changes: 7 additions & 0 deletions include/iscsi.h
Original file line number Diff line number Diff line change
Expand Up @@ -1537,6 +1537,13 @@ EXTERN void scsi_task_set_iov_in(struct scsi_task *task, struct scsi_iovec *iov,

EXTERN int scsi_task_get_status(struct scsi_task *task, struct scsi_sense *sense);

/*
* This function returns 1 if the task is queued for send (for example, the task has been created
* with an asynchronous request and has not been put on the wire right away due to the socket
* or the ISCSI session state); otherwise returns 0.
*/
EXTERN int iscsi_scsi_is_task_in_outqueue(struct iscsi_context *iscsi, struct scsi_task *task);

/*
* This function is used when you want to cancel a scsi task.
* The callback for the task will immediately be invoked with SCSI_STATUS_CANCELLED.
Expand Down
13 changes: 13 additions & 0 deletions lib/iscsi-command.c
Original file line number Diff line number Diff line change
Expand Up @@ -2675,6 +2675,19 @@ iscsi_scsi_get_task_from_pdu(struct iscsi_pdu *pdu)
return pdu->scsi_cbdata.task;
}

int iscsi_scsi_is_task_in_outqueue(struct iscsi_context *iscsi, struct scsi_task *task)
{
struct iscsi_pdu *pdu;

for (pdu = iscsi->outqueue; pdu; pdu = pdu->next) {
if (pdu->itt == task->itt) {
return 1;
}
}

return 0;
}

int
iscsi_scsi_cancel_task(struct iscsi_context *iscsi,
struct scsi_task *task)
Expand Down

0 comments on commit e4c4799

Please sign in to comment.