• Nicholas Bellinger's avatar
    iscsi-target: Fix race with thread_pre_handler flush_signals + ISCSI_THREAD_SET_DIE · d5705c4a
    Nicholas Bellinger authored
    This patch addresses an long standing race in iscsi_[rx,tx]_thread_pre_handler()
    use of flush_signals(), and between iscsi_deallocate_extra_thread_sets() setting
    ISCSI_THREAD_SET_DIE before calling kthread_stop().
    
    It addresses the issue by both holding ts_state_lock before calling send_sig()
    in iscsi_deallocate_extra_thread_sets(), as well as only calling flush_signals()
    when ts->status != ISCSI_THREAD_SET_DIE within iscsi_[rx,tx]_thread_pre_handler()
    code.
    
    v2 changes:
      - Add explicit complete(&ts->[rx,tx]_start_comp); before kthread_stop() in
        iscsi_deallocate_extra_thread_sets()
      - Drop left-over send_sig() calls in iscsi_deallocate_extra_thread_sets()
      - Add kthread_should_stop() check in iscsi_signal_thread_pre_handler()
    Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
    d5705c4a
iscsi_target_tq.c 14.2 KB