]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commit
md: always hold reconfig_mutex when calling mddev_suspend()
authorNeilBrown <neilb@suse.com>
Thu, 19 Oct 2017 01:17:16 +0000 (12:17 +1100)
committerShaohua Li <shli@fb.com>
Thu, 2 Nov 2017 04:32:18 +0000 (21:32 -0700)
commit4d5324f760aacaefeb721b172aa14bf66045c332
tree4115e3a5b37b7890c402d07ce551648b93f63844
parent230b55fa8d64007339319539f8f8e68114d08529
md: always hold reconfig_mutex when calling mddev_suspend()

Most often mddev_suspend() is called with
reconfig_mutex held.  Make this a requirement in
preparation a subsequent patch.  Also require
reconfig_mutex to be held for mddev_resume(),
partly for symmetry and partly to guarantee
no races with incr/decr of mddev->suspend.

Taking the mutex in r5c_disable_writeback_async() is
a little tricky as this is called from a work queue
via log->disable_writeback_work, and flush_work()
is called on that while holding ->reconfig_mutex.
If the work item hasn't run before flush_work()
is called, the work function will not be able to
get the mutex.

So we use mddev_trylock() inside the wait_event() call, and have that
abort when conf->log is set to NULL, which happens before
flush_work() is called.
We wait in mddev->sb_wait and ensure this is woken
when any of the conditions change.  This requires
waking mddev->sb_wait in mddev_unlock().  This is only
like to trigger extra wake_ups of threads that needn't
be woken when metadata is being written, and that
doesn't happen often enough that the cost would be
noticeable.

Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
drivers/md/dm-raid.c
drivers/md/md.c
drivers/md/raid5-cache.c