• Andreas Gruenbacher's avatar
    gfs2: Fix asynchronous thread destruction · fe4f7940
    Andreas Gruenbacher authored
    The kernel threads are currently stopped and destroyed synchronously by
    gfs2_make_fs_ro() and gfs2_put_super(), and asynchronously by
    signal_our_withdraw(), with no synchronization, so the synchronous and
    asynchronous contexts can race with each other.
    
    First, when creating the kernel threads, take an extra task struct
    reference so that the task struct won't go away immediately when they
    terminate.  This allows those kthreads to terminate immediately when
    they're done rather than hanging around as zombies until they are reaped
    by kthread_stop().  When kthread_stop() is called on a terminated
    kthread, it will return immediately.
    
    Second, in signal_our_withdraw(), once the SDF_JOURNAL_LIVE flag has
    been cleared, wake up the logd and quotad wait queues instead of
    stopping the logd and quotad kthreads.  The kthreads are then expected
    to terminate automatically within short time, but if they cannot, they
    will not block the withdraw.
    
    For example, if a user process and one of the kthread decide to withdraw
    at the same time, only one of them will perform the actual withdraw and
    the other will wait for it to be done.  If the kthread ends up being the
    one to wait, the withdrawing user process won't be able to stop it.
    Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
    fe4f7940
super.h 2.32 KB