diff options
author | Mike Christie <michaelc@cs.wisc.edu> | 2007-08-15 02:38:29 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.localdomain> | 2007-08-15 14:08:14 -0400 |
commit | 96809f1b15eddae2325b2ab78e6f931edc969074 (patch) | |
tree | dc260207b281e0f078f7b560a178565968109383 /drivers/scsi/libiscsi.c | |
parent | 604cd794de3094ccf8a9c149f299237a642ba9b5 (diff) |
[SCSI] libiscsi: fix null ptr regression when aborting a command with data to transfer
We do not want to send data if we are aborting a task. There is
a check in iscsi_xmit_ctask, but right before calling this we overwrite
the state so we always go right past the test. Sending data causes problems
because when we clean up from a successful abort the LLD assumes that
the task is not running.
Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/libiscsi.c')
-rw-r--r-- | drivers/scsi/libiscsi.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index 5606d1e62978..f5915d4d63d9 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c | |||
@@ -737,12 +737,19 @@ check_mgmt: | |||
737 | */ | 737 | */ |
738 | conn->ctask = list_entry(conn->xmitqueue.next, | 738 | conn->ctask = list_entry(conn->xmitqueue.next, |
739 | struct iscsi_cmd_task, running); | 739 | struct iscsi_cmd_task, running); |
740 | if (conn->ctask->state == ISCSI_TASK_PENDING) { | 740 | switch (conn->ctask->state) { |
741 | case ISCSI_TASK_ABORTING: | ||
742 | break; | ||
743 | case ISCSI_TASK_PENDING: | ||
741 | iscsi_prep_scsi_cmd_pdu(conn->ctask); | 744 | iscsi_prep_scsi_cmd_pdu(conn->ctask); |
742 | conn->session->tt->init_cmd_task(conn->ctask); | 745 | conn->session->tt->init_cmd_task(conn->ctask); |
746 | /* fall through */ | ||
747 | default: | ||
748 | conn->ctask->state = ISCSI_TASK_RUNNING; | ||
749 | break; | ||
743 | } | 750 | } |
744 | conn->ctask->state = ISCSI_TASK_RUNNING; | ||
745 | list_move_tail(conn->xmitqueue.next, &conn->run_list); | 751 | list_move_tail(conn->xmitqueue.next, &conn->run_list); |
752 | |||
746 | rc = iscsi_xmit_ctask(conn); | 753 | rc = iscsi_xmit_ctask(conn); |
747 | if (rc) | 754 | if (rc) |
748 | goto again; | 755 | goto again; |