• NeilBrown's avatar
    md: Check MD_RECOVERY_RUNNING as well as ->sync_thread. · f851b60d
    NeilBrown authored
    A recent change to md started the ->sync_thread from a asynchronously
    from a work_queue rather than synchronously.  This means that there
    can be a small window between the time when MD_RECOVERY_RUNNING is set
    and when ->sync_thread is set.
    
    So code that checks ->sync_thread might now conclude that the thread
    has not been started and (because a lock is held) will not be started.
    That is no longer the case.
    
    Most of those places are best fixed by testing MD_RECOVERY_RUNNING
    as well.  To make this completely reliable, we wake_up(&resync_wait)
    after clearing that flag as well as after clearing ->sync_thread.
    
    Other places are better served by flushing the relevant workqueue
    to ensure that that if the sync thread was starting, it has now
    started.  This is particularly best if we are about to stop the
    sync thread.
    
    Fixes: ac05f256Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    f851b60d
md.c 222 KB