Re: [PATCH] raid1: include bio_end_io_list in nr_queued to prevent freeze_array hang

From
Shaohua Li <shli@kernel.org>
Date
2016-03-14 18:59:41
Reply to
Shaohua Li, 2016-03-06
On Sun, Mar 06, 2016 at 03:33:04PM -0800, Shaohua Li wrote:
On Mon, Feb 29, 2016 at 10:43:58AM -0500, Nate Dailey wrote:
quoted
If raid1d is handling a mix of read and write errors, handle_read_error's
call to freeze_array can get stuck.

This can happen because, though the bio_end_io_list is initially drained,
writes can be added to it via handle_write_finished as the retry_list
is processed. These writes contribute to nr_pending but are not included
in nr_queued.

If a later entry on the retry_list triggers a call to handle_read_error,
freeze array hangs waiting for nr_pending == nr_queued+extra. The writes
on the bio_end_io_list aren't included in nr_queued so the condition will
never be satisfied.

To prevent the hang, include bio_end_io_list writes in nr_queued.

There's probably a better way to handle decrementing nr_queued, but this
seemed like the safest way to avoid breaking surrounding code.

I'm happy to supply the script I used to repro this hang.
Looks good. Could you please also fix raid10?
Alright, I applied the patch and added raid10 part so this can be applied to 4.6
Thread (5 messages) 5 messages, 3 authors, last reply 2016-03-17
Keyboard shortcuts
hback out one level
jnext message in thread / next series-diff position
kprevious message in thread / previous series-diff position
ldrill in
Escclose help / fold thread tree
?toggle this help