]> git.karo-electronics.de Git - karo-tx-linux.git/commit
target: close target_put_sess_cmd() vs. core_tmr_abort_task() race
authorJoern Engel <joern@logfs.org>
Mon, 13 May 2013 20:30:06 +0000 (16:30 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 19 May 2013 18:38:43 +0000 (11:38 -0700)
commit114b8afe93aa6bf9ffd97874643e7f8485865012
treecc749558db6fb0efc7279b459848d3d03a644a06
parentc597f2a40780026e4574e02e05296e22ad84c58f
target: close target_put_sess_cmd() vs. core_tmr_abort_task() race

commit ccf5ae83a6cf3d9cfe9a7038bfe7cd38ab03d5e1 upstream.

It is possible for one thread to to take se_sess->sess_cmd_lock in
core_tmr_abort_task() before taking a reference count on
se_cmd->cmd_kref, while another thread in target_put_sess_cmd() drops
se_cmd->cmd_kref before taking se_sess->sess_cmd_lock.

This introduces kref_put_spinlock_irqsave() and uses it in
target_put_sess_cmd() to close the race window.

Signed-off-by: Joern Engel <joern@logfs.org>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/target/target_core_transport.c
include/linux/kref.h