| From 77039d1eafbbc192df71ee84b157b8973766737d Mon Sep 17 00:00:00 2001 |
| From: Nicholas Bellinger <nab@linux-iscsi.org> |
| Date: Thu, 29 Sep 2011 01:01:35 -0700 |
| Subject: target: Fix transport_cmd_finish_abort queue removal bug |
| |
| From: Nicholas Bellinger <nab@linux-iscsi.org> |
| |
| commit 77039d1eafbbc192df71ee84b157b8973766737d upstream. |
| |
| This patch fixes a bug in LUN_RESET operation with transport_cmd_finish_abort() |
| where transport_remove_cmd_from_queue() was incorrectly being called, causing |
| descriptors with t_state == TRANSPORT_FREE_CMD_INTR to be incorrectly removed |
| from qobj->qobj_list during process context release. This change ensures the |
| descriptor is only removed via transport_remove_cmd_from_queue() when doing a |
| direct release via transport_generic_remove(). |
| |
| Signed-off-by: Nicholas Bellinger <nab@risingtidesystems.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/target/target_core_transport.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/target/target_core_transport.c |
| +++ b/drivers/target/target_core_transport.c |
| @@ -594,13 +594,14 @@ check_lun: |
| |
| void transport_cmd_finish_abort(struct se_cmd *cmd, int remove) |
| { |
| - transport_remove_cmd_from_queue(cmd, &cmd->se_dev->dev_queue_obj); |
| transport_lun_remove_cmd(cmd); |
| |
| if (transport_cmd_check_stop_to_fabric(cmd)) |
| return; |
| - if (remove) |
| + if (remove) { |
| + transport_remove_cmd_from_queue(cmd, &cmd->se_dev->dev_queue_obj); |
| transport_generic_remove(cmd, 0); |
| + } |
| } |
| |
| void transport_cmd_finish_abort_tmr(struct se_cmd *cmd) |