linux/drivers/target/iscsi
Bart Van Assche 3e45c8554b scsi: target/iscsi: Avoid iscsit_release_commands_from_conn() deadlock
commit 32e36bfbcf upstream.

When using SCSI passthrough in combination with the iSCSI target driver
then cmd->t_state_lock may be obtained from interrupt context. Hence, all
code that obtains cmd->t_state_lock from thread context must disable
interrupts first. This patch avoids that lockdep reports the following:

WARNING: inconsistent lock state
4.18.0-dbg+ #1 Not tainted
--------------------------------
inconsistent {HARDIRQ-ON-W} -> {IN-HARDIRQ-W} usage.
iscsi_ttx/1800 [HC1[1]:SC0[2]:HE0:SE0] takes:
000000006e7b0ceb (&(&cmd->t_state_lock)->rlock){?...}, at: target_complete_cmd+0x47/0x2c0 [target_core_mod]
{HARDIRQ-ON-W} state was registered at:
 lock_acquire+0xd2/0x260
 _raw_spin_lock+0x32/0x50
 iscsit_close_connection+0x97e/0x1020 [iscsi_target_mod]
 iscsit_take_action_for_connection_exit+0x108/0x200 [iscsi_target_mod]
 iscsi_target_rx_thread+0x180/0x190 [iscsi_target_mod]
 kthread+0x1cf/0x1f0
 ret_from_fork+0x24/0x30
irq event stamp: 1281
hardirqs last  enabled at (1279): [<ffffffff970ade79>] __local_bh_enable_ip+0xa9/0x160
hardirqs last disabled at (1281): [<ffffffff97a008a5>] interrupt_entry+0xb5/0xd0
softirqs last  enabled at (1278): [<ffffffff977cd9a1>] lock_sock_nested+0x51/0xc0
softirqs last disabled at (1280): [<ffffffffc07a6e04>] ip6_finish_output2+0x124/0xe40 [ipv6]

other info that might help us debug this:
Possible unsafe locking scenario:

      CPU0
      ----
 lock(&(&cmd->t_state_lock)->rlock);
 <Interrupt>
   lock(&(&cmd->t_state_lock)->rlock);
History 2019-07-09 22:03:54 +01:00
..
iscsi_target.c scsi: target/iscsi: Avoid iscsit_release_commands_from_conn() deadlock 2019-07-09 22:03:54 +01:00
iscsi_target.h iscsi/iser-target: Convert to command priv_size usage 2013-09-09 14:29:21 -07:00
iscsi_target_auth.c scsi: target: iscsi: Use hex2bin instead of a re-implementation 2018-10-03 04:10:08 +01:00
iscsi_target_auth.h iscsi-target: Fix CHAP_A parameter list handling 2014-06-05 19:44:02 -07:00
iscsi_target_configfs.c iscsi-target: Add login_keys_workaround attribute for non RFC initiators 2017-10-12 15:28:04 +01:00
iscsi_target_configfs.h iscsi-target: Add iSCSI fabric support for target v4.1 2011-07-26 09:16:43 +00:00
iscsi_target_core.h iscsi-target: Fix iscsi_np reset hung task during parallel delete 2017-11-11 13:33:16 +00:00
iscsi_target_datain_values.c target: Update copyright ownership/year information to 2013 2013-09-10 20:23:36 -07:00
iscsi_target_datain_values.h iscsi-target: Add iSCSI fabric support for target v4.1 2011-07-26 09:16:43 +00:00
iscsi_target_device.c iscsi-target: Fix mutex_trylock usage in iscsit_increment_maxcmdsn 2013-11-12 17:54:56 -08:00
iscsi_target_device.h target/iscsi: Remove unneeded wrapper functions 2012-02-25 14:37:47 -08:00
iscsi_target_erl0.c iscsi-target: Always wait for kthread_should_stop() before kthread exit 2017-09-15 18:29:53 +01:00
iscsi_target_erl0.h iscsi-target: Always wait for kthread_should_stop() before kthread exit 2017-09-15 18:29:53 +01:00
iscsi_target_erl1.c iscsi-target: Fix SNACK Type 1 + BegRun=0 handling 2014-02-12 15:11:17 -08:00
iscsi_target_erl1.h iscsit: use the itt_t abstract type 2012-10-03 14:21:50 -07:00
iscsi_target_erl2.c iscsi/iser-target: Use list_del_init for ->i_conn_node 2014-03-04 17:54:09 -08:00
iscsi_target_erl2.h iscsit: proper endianess conversions 2012-10-03 14:39:22 -07:00
iscsi_target_login.c iscsi target: fix session creation failure handling 2018-12-16 22:08:50 +00:00
iscsi_target_login.h iscsi-target: Fix iscsit_start_kthreads failure OOPs 2015-08-20 19:58:05 +01:00
iscsi_target_nego.c iscsi-target: Add login_keys_workaround attribute for non RFC initiators 2017-10-12 15:28:04 +01:00
iscsi_target_nego.h iscsi-target: Initial traditional TCP conversion to iscsit_transport 2013-04-25 01:05:26 -07:00
iscsi_target_nodeattrib.c iscsi-target: Expose default_erl as TPG attribute 2013-11-20 11:57:18 -08:00
iscsi_target_nodeattrib.h iscsi-target: Expose default_erl as TPG attribute 2013-11-20 11:57:18 -08:00
iscsi_target_parameters.c iscsi-target: Add login_keys_workaround attribute for non RFC initiators 2017-10-12 15:28:04 +01:00
iscsi_target_parameters.h iscsi-target: Add login_keys_workaround attribute for non RFC initiators 2017-10-12 15:28:04 +01:00
iscsi_target_seq_pdu_list.c target: Update copyright ownership/year information to 2013 2013-09-10 20:23:36 -07:00
iscsi_target_seq_pdu_list.h target/iscsi: Fold _decide_list_to_build into _build_pdu_and_seq_lists 2012-04-14 17:40:38 -07:00
iscsi_target_stat.c iscsi-target: Convert iscsi_session statistics to atomic_long_t 2013-11-19 21:38:52 -08:00
iscsi_target_stat.h iscsi-target: Add iSCSI fabric support for target v4.1 2011-07-26 09:16:43 +00:00
iscsi_target_tmr.c target: Update copyright ownership/year information to 2013 2013-09-10 20:23:36 -07:00
iscsi_target_tmr.h iscsi-target: Add iSCSI fabric support for target v4.1 2011-07-26 09:16:43 +00:00
iscsi_target_tpg.c scsi: target/iscsi: Make iscsit_ta_authentication() respect the output buffer size 2018-12-16 22:08:08 +00:00
iscsi_target_tpg.h iscsi-target: Add login_keys_workaround attribute for non RFC initiators 2017-10-12 15:28:04 +01:00
iscsi_target_tq.c iscsi-target: Drop problematic active_ts_list usage 2015-03-02 13:17:18 +00:00
iscsi_target_tq.h iscsi-target: Add thread_set->ts_activate_sem + use common deallocate 2013-09-10 20:23:05 -07:00
iscsi_target_transport.c iscsi-target: Add iscsit_transport API template 2013-04-25 01:05:26 -07:00
iscsi_target_util.c iscsi-target: Fix TMR reference leak during session shutdown 2017-07-18 18:40:26 +01:00
iscsi_target_util.h target: Add TFO->abort_task for aborted task resources release 2014-04-07 01:48:51 -07:00
Kconfig target: iscsi_target depends on NET 2011-07-28 20:16:18 +00:00
Makefile iscsi-target: Add iscsit_transport API template 2013-04-25 01:05:26 -07:00