• E
    signal: Allow cifs and drbd to receive their terminating signals · 33da8e7c
    Eric W. Biederman 提交于
    My recent to change to only use force_sig for a synchronous events
    wound up breaking signal reception cifs and drbd.  I had overlooked
    the fact that by default kthreads start out with all signals set to
    SIG_IGN.  So a change I thought was safe turned out to have made it
    impossible for those kernel thread to catch their signals.
    
    Reverting the work on force_sig is a bad idea because what the code
    was doing was very much a misuse of force_sig.  As the way force_sig
    ultimately allowed the signal to happen was to change the signal
    handler to SIG_DFL.  Which after the first signal will allow userspace
    to send signals to these kernel threads.  At least for
    wake_ack_receiver in drbd that does not appear actively wrong.
    
    So correct this problem by adding allow_kernel_signal that will allow
    signals whose siginfo reports they were sent by the kernel through,
    but will not allow userspace generated signals, and update cifs and
    drbd to call allow_kernel_signal in an appropriate place so that their
    thread can receive this signal.
    
    Fixing things this way ensures that userspace won't be able to send
    signals and cause problems, that it is clear which signals the
    threads are expecting to receive, and it guarantees that nothing
    else in the system will be affected.
    
    This change was partly inspired by similar cifs and drbd patches that
    added allow_signal.
    Reported-by: Nronnie sahlberg <ronniesahlberg@gmail.com>
    Reported-by: NChristoph Böhmwalder <christoph.boehmwalder@linbit.com>
    Tested-by: NChristoph Böhmwalder <christoph.boehmwalder@linbit.com>
    Cc: Steve French <smfrench@gmail.com>
    Cc: Philipp Reisner <philipp.reisner@linbit.com>
    Cc: David Laight <David.Laight@ACULAB.COM>
    Fixes: 247bc947 ("cifs: fix rmmod regression in cifs.ko caused by force_sig changes")
    Fixes: 72abe3bc ("signal/cifs: Fix cifs_put_tcp_session to call send_sig instead of force_sig")
    Fixes: fee10990 ("signal/drbd: Use send_sig not force_sig")
    Fixes: 3cf5d076 ("signal: Remove task parameter from force_sig")
    Signed-off-by: N"Eric W. Biederman" <ebiederm@xmission.com>
    33da8e7c
drbd_main.c 111.8 KB