From 15f4e85b81c918f162c1dc7707d2a39134205b93 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Sat, 10 Sep 2011 17:21:23 +1000 Subject: [PATCH] --- yaml --- r: 263705 b: refs/heads/master c: 079fa166a2874985ae58b2e21e26e1cbc91127d4 h: refs/heads/master i: 263703: 24ed5e98a581f05d6b22ab0b60e2c610607d40e3 v: v3 --- [refs] | 2 +- trunk/drivers/md/raid1.c | 14 +++++++++----- trunk/drivers/md/raid10.c | 13 ++++++++----- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/[refs] b/[refs] index 51316d8cb200..b2c3804bc186 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 19d5f834d6aff7efb1c9353523865c5bce869470 +refs/heads/master: 079fa166a2874985ae58b2e21e26e1cbc91127d4 diff --git a/trunk/drivers/md/raid1.c b/trunk/drivers/md/raid1.c index 32323f0afd89..f4622dd8fc59 100644 --- a/trunk/drivers/md/raid1.c +++ b/trunk/drivers/md/raid1.c @@ -1099,12 +1099,11 @@ static int make_request(mddev_t *mddev, struct bio * bio) bio_list_add(&conf->pending_bio_list, mbio); spin_unlock_irqrestore(&conf->device_lock, flags); } - r1_bio_write_done(r1_bio); - - /* In case raid1d snuck in to freeze_array */ - wake_up(&conf->wait_barrier); - + /* Mustn't call r1_bio_write_done before this next test, + * as it could result in the bio being freed. + */ if (sectors_handled < (bio->bi_size >> 9)) { + r1_bio_write_done(r1_bio); /* We need another r1_bio. It has already been counted * in bio->bi_phys_segments */ @@ -1117,6 +1116,11 @@ static int make_request(mddev_t *mddev, struct bio * bio) goto retry_write; } + r1_bio_write_done(r1_bio); + + /* In case raid1d snuck in to freeze_array */ + wake_up(&conf->wait_barrier); + if (do_sync || !bitmap || !plugged) md_wakeup_thread(mddev->thread); diff --git a/trunk/drivers/md/raid10.c b/trunk/drivers/md/raid10.c index f6873fc8e5ee..d7a8468ddeab 100644 --- a/trunk/drivers/md/raid10.c +++ b/trunk/drivers/md/raid10.c @@ -1132,13 +1132,12 @@ static int make_request(mddev_t *mddev, struct bio * bio) spin_unlock_irqrestore(&conf->device_lock, flags); } - /* Remove the bias on 'remaining' */ - one_write_done(r10_bio); - - /* In case raid10d snuck in to freeze_array */ - wake_up(&conf->wait_barrier); + /* Don't remove the bias on 'remaining' (one_write_done) until + * after checking if we need to go around again. + */ if (sectors_handled < (bio->bi_size >> 9)) { + one_write_done(r10_bio); /* We need another r10_bio. It has already been counted * in bio->bi_phys_segments. */ @@ -1152,6 +1151,10 @@ static int make_request(mddev_t *mddev, struct bio * bio) r10_bio->state = 0; goto retry_write; } + one_write_done(r10_bio); + + /* In case raid10d snuck in to freeze_array */ + wake_up(&conf->wait_barrier); if (do_sync || !mddev->bitmap || !plugged) md_wakeup_thread(mddev->thread);