Messages in this thread Patch in this message | | | From | Luis Henriques <> | Subject | [PATCH 3.16.y-ckt 14/58] md/raid5: fix another livelock caused by non-aligned writes. | Date | Thu, 19 Feb 2015 13:51:44 +0000 |
| |
3.16.7-ckt7 -stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <neilb@suse.de>
commit b1b02fe97f75b12ab34b2303bfd4e3526d903a58 upstream.
If a non-page-aligned write is destined for a device which is missing/faulty, we can deadlock.
As the target device is missing, a read-modify-write cycle is not possible. As the write is not for a full-page, a recontruct-write cycle is not possible.
This should be handled by logic in fetch_block() which notices there is a non-R5_OVERWRITE write to a missing device, and so loads all blocks.
However since commit 67f455486d2ea2, that code requires STRIPE_PREREAD_ACTIVE before it will active, and those circumstances never set STRIPE_PREREAD_ACTIVE.
So: in handle_stripe_dirtying, if neither rmw or rcw was possible, set STRIPE_DELAYED, which will cause STRIPE_PREREAD_ACTIVE be set after a suitable delay.
Fixes: 67f455486d2ea20b2d94d6adf5b9b783d079e321 Reported-by: Mikulas Patocka <mpatocka@redhat.com> Tested-by: Heinz Mauelshagen <heinzm@redhat.com> Signed-off-by: NeilBrown <neilb@suse.de> Signed-off-by: Luis Henriques <luis.henriques@canonical.com> --- drivers/md/raid5.c | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 222aa7521877..68a03d7f25ee 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -3204,6 +3204,11 @@ static void handle_stripe_dirtying(struct r5conf *conf, (unsigned long long)sh->sector, rcw, qread, test_bit(STRIPE_DELAYED, &sh->state)); } + + if (rcw > disks && rmw > disks && + !test_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) + set_bit(STRIPE_DELAYED, &sh->state); + /* now if nothing is locked, and if we have enough data, * we can start a write request */ -- 2.1.4
| |