• Oleg Nesterov's avatar
    signals: jffs2: fix the wrong usage of disallow_signal() · c240837f
    Oleg Nesterov authored
    jffs2_garbage_collect_thread() does disallow_signal(SIGHUP) around
    jffs2_garbage_collect_pass() and the comment says "We don't want SIGHUP
    to interrupt us".
    
    But disallow_signal() can't ensure that jffs2_garbage_collect_pass()
    won't be interrupted by SIGHUP, the problem is that SIGHUP can be
    already pending when disallow_signal() is called, and in this case any
    interruptible sleep won't block.
    
    Note: this is in fact because disallow_signal() is buggy and should be
    fixed, see the next changes.
    
    But there is another reason why disallow_signal() is wrong: SIG_IGN set
    by disallow_signal() silently discards any SIGHUP which can be sent
    before the next allow_signal(SIGHUP).
    
    Change this code to use sigprocmask(SIG_UNBLOCK/SIG_BLOCK, SIGHUP).
    This even matches the old (and wrong) semantics allow/disallow had when
    this logic was written.
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Al Viro <viro@ZenIV.linux.org.uk>
    Cc: David Woodhouse <dwmw2@infradead.org>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Geert Uytterhoeven <geert@linux-m68k.org>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Cc: Richard Weinberger <richard@nod.at>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Tejun Heo <tj@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    c240837f
background.c 4.33 KB