target: Prevent TRANSPORT_FREE_CMD_INTR processing in core_tmr_drain_cmd_list
authorNicholas Bellinger <nab@linux-iscsi.org>
Tue, 11 Oct 2011 06:02:48 +0000 (06:02 +0000)
committerNicholas Bellinger <nab@linux-iscsi.org>
Mon, 24 Oct 2011 03:19:49 +0000 (03:19 +0000)
This patch contains a bugfix for TMR LUN_RESET related to TRANSPORT_FREE_CMD_INTR
operation, where core_tmr_drain_cmd_list() will now skip processing for this
case to prevent an ABORT_TASK status from being returned for descriptors that
are already queued up to be released by processing thread context.

Cc: Roland Dreier <roland@purestorage.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: stable@kernel.org
Signed-off-by: Nicholas Bellinger <nab@risingtidesystems.com>
drivers/target/target_core_tmr.c

index ed0b1ff99110306abe8e5381b321d8a5f8d38bfe..d04cc1016ebf2e94226a479b7f035183888feb4d 100644 (file)
@@ -339,6 +339,16 @@ static void core_tmr_drain_cmd_list(
                 */
                if (prout_cmd == cmd)
                        continue;
+               /*
+                * Skip direct processing of TRANSPORT_FREE_CMD_INTR for
+                * HW target mode fabrics.
+                */
+               spin_lock(&cmd->t_state_lock);
+               if (cmd->t_state == TRANSPORT_FREE_CMD_INTR) {
+                       spin_unlock(&cmd->t_state_lock);
+                       continue;
+               }
+               spin_unlock(&cmd->t_state_lock);
 
                atomic_set(&cmd->t_transport_queue_active, 0);
                atomic_dec(&qobj->queue_cnt);