summaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@redhat.com>2020-08-24 20:19:55 +0200
committerMike Snitzer <snitzer@redhat.com>2020-09-01 22:41:56 +0200
commitc322ee9320eaa4013ca3620b1130992916b19b31 (patch)
tree2f7a395244b925895261a7386467a18054b3fc8c /mm
parentdm writecache: handle DAX to partitions on persistent memory correctly (diff)
downloadlinux-c322ee9320eaa4013ca3620b1130992916b19b31.tar.xz
linux-c322ee9320eaa4013ca3620b1130992916b19b31.zip
dm mpath: fix racey management of PG initialization
Commit 935fcc56abc3 ("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: 935fcc56abc3 ("dm mpath: only flush workqueue when needed") Cc: stable@vger.kernel.org Reported-by: Ben Marzinski <bmarzins@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'mm')
0 files changed, 0 insertions, 0 deletions