| From d47c8ad261f787af22a220ffcc2d07afba809223 Mon Sep 17 00:00:00 2001 |
| From: NeilBrown <neilb@suse.com> |
| Date: Thu, 5 Oct 2017 16:23:16 +1100 |
| Subject: md: fix deadlock error in recent patch. |
| |
| From: NeilBrown <neilb@suse.com> |
| |
| commit d47c8ad261f787af22a220ffcc2d07afba809223 upstream. |
| |
| A recent patch aimed to cause md_write_start() to fail (rather than |
| block) when the mddev was suspending, so as to avoid deadlocks. |
| Unfortunately the test in wait_event() was wrong, and it didn't change |
| behaviour at all. |
| |
| We wait_event() must wait until the metadata is written OR the array is |
| suspending. |
| |
| Fixes: cc27b0c78c79 ("md: fix deadlock between mddev_suspend() and md_write_start()") |
| Reported-by: Xiao Ni <xni@redhat.com> |
| Signed-off-by: NeilBrown <neilb@suse.com> |
| Signed-off-by: Shaohua Li <shli@fb.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/md/md.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/md/md.c |
| +++ b/drivers/md/md.c |
| @@ -8039,7 +8039,8 @@ bool md_write_start(struct mddev *mddev, |
| if (did_change) |
| sysfs_notify_dirent_safe(mddev->sysfs_state); |
| wait_event(mddev->sb_wait, |
| - !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags) && !mddev->suspended); |
| + !test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags) || |
| + mddev->suspended); |
| if (test_bit(MD_SB_CHANGE_PENDING, &mddev->sb_flags)) { |
| percpu_ref_put(&mddev->writes_pending); |
| return false; |