summaryrefslogtreecommitdiffstats
path: root/virt
diff options
context:
space:
mode:
authorNate Dailey2017-10-17 14:17:03 +0200
committerShaohua Li2017-11-02 05:32:21 +0100
commitf6eca2d43ed694ab8124dd24c88277f7eca93b7d (patch)
tree1ad48d4f54a13f586f9efcc7f1404d089300265c /virt
parentmd: use TASK_IDLE instead of blocking signals (diff)
downloadkernel-qcow2-linux-f6eca2d43ed694ab8124dd24c88277f7eca93b7d.tar.gz
kernel-qcow2-linux-f6eca2d43ed694ab8124dd24c88277f7eca93b7d.tar.xz
kernel-qcow2-linux-f6eca2d43ed694ab8124dd24c88277f7eca93b7d.zip
raid1: prevent freeze_array/wait_all_barriers deadlock
If freeze_array is attempted in the middle of close_sync/ wait_all_barriers, deadlock can occur. freeze_array will wait for nr_pending and nr_queued to line up. wait_all_barriers increments nr_pending for each barrier bucket, one at a time, but doesn't actually issue IO that could be counted in nr_queued. So freeze_array is blocked until wait_all_barriers completes and allow_all_barriers runs. At the same time, when _wait_barrier sees array_frozen == 1, it stops and waits for freeze_array to complete. Prevent the deadlock by making close_sync call _wait_barrier and _allow_barrier for one bucket at a time, instead of deferring the _allow_barrier calls until after all _wait_barriers are complete. Signed-off-by: Nate Dailey <nate.dailey@stratus.com> Fix: fd76863e37fe(RAID1: a new I/O barrier implementation to remove resync window) Reviewed-by: Coly Li <colyli@suse.de> Cc: stable@vger.kernel.org (v4.11) Signed-off-by: Shaohua Li <shli@fb.com>
Diffstat (limited to 'virt')
0 files changed, 0 insertions, 0 deletions