checking if task is in outqueue

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_);
}
This commit is contained in:
Anatoliy Glagolev
2023-09-19 18:40:13 -06:00
parent 75a46d2b2e
commit e4c4799f29
2 changed files with 20 additions and 0 deletions

View File

@@ -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.