From b81d21ce8ce838cbbee7c981731b40f2ad1df070 Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Sat, 19 Feb 2011 18:04:55 +1100 Subject: [PATCH] TaskManagement: Add a function to abort a scsi_task --- include/iscsi.h | 12 ++++++++++-- include/scsi-lowlevel.h | 1 + lib/scsi-command.c | 1 + lib/task_mgmt.c | 26 ++++++++++++++++++-------- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/include/iscsi.h b/include/iscsi.h index ae8b8b1..841cf92 100644 --- a/include/iscsi.h +++ b/include/iscsi.h @@ -413,6 +413,8 @@ struct iscsi_discovery_address { int iscsi_nop_out_async(struct iscsi_context *iscsi, iscsi_command_cb cb, unsigned char *data, int len, void *private_data); +struct scsi_task; + enum iscsi_task_mgmt_funcs { ISCSI_TM_ABORT_TASK = 0x01, ISCSI_TM_ABORT_TASK_SET = 0x02, @@ -423,6 +425,7 @@ enum iscsi_task_mgmt_funcs { ISCSI_TM_TARGET_COLD_RESET = 0x07, ISCSI_TM_TASK_REASSIGN = 0x08 }; + /* * Asynchronous call for task management * @@ -433,7 +436,8 @@ enum iscsi_task_mgmt_funcs { * * Callback parameters : * status can be either of : - * ISCSI_STATUS_GOOD : Connection was successful. Command_data is NULL. + * ISCSI_STATUS_GOOD : Connection was successful. Command_data is a pointer to uint32_t + * containing the response code as per RFC3720/10.6.1 * * ISCSI_STATUS_ERROR : Error. * @@ -446,6 +450,11 @@ iscsi_task_mgmt_async(struct iscsi_context *iscsi, uint32_t ritt, uint32_t rcmdscn, iscsi_command_cb cb, void *private_data); +int +iscsi_task_mgmt_abort_task_async(struct iscsi_context *iscsi, + struct scsi_task *task, + iscsi_command_cb cb, void *private_data); + @@ -496,7 +505,6 @@ iscsi_set_isid_reserved(struct iscsi_context *iscsi); /* * Async commands for SCSI */ -struct scsi_task; int iscsi_scsi_command_async(struct iscsi_context *iscsi, int lun, struct scsi_task *task, iscsi_command_cb cb, struct iscsi_data *data, void *private_data); diff --git a/include/scsi-lowlevel.h b/include/scsi-lowlevel.h index 286d615..c0f2b4f 100644 --- a/include/scsi-lowlevel.h +++ b/include/scsi-lowlevel.h @@ -129,6 +129,7 @@ struct scsi_task { uint32_t itt; uint32_t cmdsn; + uint32_t lun; }; void scsi_free_scsi_task(struct scsi_task *task); diff --git a/lib/scsi-command.c b/lib/scsi-command.c index bf4b6e4..8b04faa 100644 --- a/lib/scsi-command.c +++ b/lib/scsi-command.c @@ -326,6 +326,7 @@ iscsi_scsi_command_async(struct iscsi_context *iscsi, int lun, /* remember cmdsn and itt so we can use task management */ task->cmdsn = pdu->cmdsn; task->itt = pdu->itt; + task->lun = lun; return 0; } diff --git a/lib/task_mgmt.c b/lib/task_mgmt.c index 6732791..f8b3e2b 100644 --- a/lib/task_mgmt.c +++ b/lib/task_mgmt.c @@ -18,6 +18,7 @@ #include #include "iscsi.h" #include "iscsi-private.h" +#include "scsi-lowlevel.h" int iscsi_task_mgmt_async(struct iscsi_context *iscsi, @@ -76,16 +77,25 @@ int iscsi_process_task_mgmt_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, struct iscsi_in_pdu *in) { - struct iscsi_data data; + uint32_t response; - data.data = NULL; - data.size = 0; + response = in->hdr[2]; - if (in->data_pos > ISCSI_HEADER_SIZE) { - data.data = in->data; - data.size = in->data_pos; - } - pdu->callback(iscsi, SCSI_STATUS_GOOD, &data, pdu->private_data); + pdu->callback(iscsi, SCSI_STATUS_GOOD, &response, pdu->private_data); return 0; } + + +int +iscsi_task_mgmt_abort_task_async(struct iscsi_context *iscsi, + struct scsi_task *task, + iscsi_command_cb cb, void *private_data) +{ + return iscsi_task_mgmt_async(iscsi, + task->lun, ISCSI_TM_ABORT_TASK, + task->itt, task->cmdsn, + cb, private_data); +} + +