• Mike Snitzer's avatar
    dm mpath: fix racey management of PG initialization · c322ee93
    Mike Snitzer authored
    Commit 935fcc56 ("dm mpath: only flush workqueue when needed")
    changed flush_multipath_work() to avoid needless workqueue
    flushing (of a multipath global workqueue). But that change didn't
    realize the surrounding flush_multipath_work() code should also only
    run if 'pg_init_in_progress' is set.
    
    Fix this by only doing all of flush_multipath_work()'s PG init related
    work if 'pg_init_in_progress' is set.
    
    Otherwise multipath_wait_for_pg_init_completion() will run
    unconditionally but the preceeding flush_workqueue(kmpath_handlerd)
    may not. This could lead to deadlock (though only if kmpath_handlerd
    never runs a corresponding work to decrement 'pg_init_in_progress').
    
    It could also be, though highly unlikely, that the kmpath_handlerd
    work that does PG init completes before 'pg_init_in_progress' is set,
    and then an intervening DM table reload's multipath_postsuspend()
    triggers flush_multipath_work().
    
    Fixes: 935fcc56 ("dm mpath: only flush workqueue when needed")
    Cc: stable@vger.kernel.org
    Reported-by: default avatarBen Marzinski <bmarzins@redhat.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    c322ee93
dm-mpath.c 54.4 KB