]> www.infradead.org Git - users/jedix/linux-maple.git/commit
target: Fix LUN_RESET active TMR descriptor handling
authorNicholas Bellinger <nab@linux-iscsi.org>
Tue, 12 Jan 2016 05:53:05 +0000 (21:53 -0800)
committerChuck Anderson <chuck.anderson@oracle.com>
Thu, 26 May 2016 22:44:50 +0000 (15:44 -0700)
commit97107aa583b6e8f3cf596de0bddfbcd1d754e445
tree26a8641a787c51ea1341745412e9fc8194bd1764
parent0c062e4f559ba64b6203d90f9106caf4425f703f
target: Fix LUN_RESET active TMR descriptor handling

Orabug: 23330830

[ Upstream commit a6d9bb1c9605cd4f44e2d8290dc4d0e88f20292d ]

This patch fixes a NULL pointer se_cmd->cmd_kref < 0
refcount bug during TMR LUN_RESET with active TMRs,
triggered during se_cmd + se_tmr_req descriptor
shutdown + release via core_tmr_drain_tmr_list().

To address this bug, go ahead and obtain a local
kref_get_unless_zero(&se_cmd->cmd_kref) for active I/O
to set CMD_T_ABORTED, and transport_wait_for_tasks()
followed by the final target_put_sess_cmd() to drop
the local ->cmd_kref.

Also add two new checks within target_tmr_work() to
avoid CMD_T_ABORTED -> TFO->queue_tm_rsp() callbacks
ahead of invoking the backend -> fabric put in
transport_cmd_check_stop_to_fabric().

For good measure, also change core_tmr_release_req()
to use list_del_init() ahead of se_tmr_req memory
free.

Reviewed-by: Quinn Tran <quinn.tran@qlogic.com>
Cc: Himanshu Madhani <himanshu.madhani@qlogic.com>
Cc: Sagi Grimberg <sagig@mellanox.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Hannes Reinecke <hare@suse.de>
Cc: Andy Grover <agrover@redhat.com>
Cc: Mike Christie <mchristi@redhat.com>
Cc: stable@vger.kernel.org # 3.10+
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
(cherry picked from commit 422d2ab7e8cc67ed57d79a297f6832c74c0a0d80)

Signed-off-by: Dan Duval <dan.duval@oracle.com>
drivers/target/target_core_tmr.c
drivers/target/target_core_transport.c