diff options
Diffstat (limited to 'drivers/md/raid1.c')
-rw-r--r-- | drivers/md/raid1.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 7ed59351fe97..af5056d56878 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -666,8 +666,11 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect | |||
666 | break; | 666 | break; |
667 | } | 667 | } |
668 | continue; | 668 | continue; |
669 | } else | 669 | } else { |
670 | if ((sectors > best_good_sectors) && (best_disk >= 0)) | ||
671 | best_disk = -1; | ||
670 | best_good_sectors = sectors; | 672 | best_good_sectors = sectors; |
673 | } | ||
671 | 674 | ||
672 | if (best_disk >= 0) | 675 | if (best_disk >= 0) |
673 | /* At least two disks to choose from so failfast is OK */ | 676 | /* At least two disks to choose from so failfast is OK */ |
@@ -1529,17 +1532,16 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio, | |||
1529 | plug = container_of(cb, struct raid1_plug_cb, cb); | 1532 | plug = container_of(cb, struct raid1_plug_cb, cb); |
1530 | else | 1533 | else |
1531 | plug = NULL; | 1534 | plug = NULL; |
1532 | spin_lock_irqsave(&conf->device_lock, flags); | ||
1533 | if (plug) { | 1535 | if (plug) { |
1534 | bio_list_add(&plug->pending, mbio); | 1536 | bio_list_add(&plug->pending, mbio); |
1535 | plug->pending_cnt++; | 1537 | plug->pending_cnt++; |
1536 | } else { | 1538 | } else { |
1539 | spin_lock_irqsave(&conf->device_lock, flags); | ||
1537 | bio_list_add(&conf->pending_bio_list, mbio); | 1540 | bio_list_add(&conf->pending_bio_list, mbio); |
1538 | conf->pending_count++; | 1541 | conf->pending_count++; |
1539 | } | 1542 | spin_unlock_irqrestore(&conf->device_lock, flags); |
1540 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
1541 | if (!plug) | ||
1542 | md_wakeup_thread(mddev->thread); | 1543 | md_wakeup_thread(mddev->thread); |
1544 | } | ||
1543 | } | 1545 | } |
1544 | 1546 | ||
1545 | r1_bio_write_done(r1_bio); | 1547 | r1_bio_write_done(r1_bio); |
@@ -3197,7 +3199,7 @@ static int raid1_reshape(struct mddev *mddev) | |||
3197 | struct r1conf *conf = mddev->private; | 3199 | struct r1conf *conf = mddev->private; |
3198 | int cnt, raid_disks; | 3200 | int cnt, raid_disks; |
3199 | unsigned long flags; | 3201 | unsigned long flags; |
3200 | int d, d2, err; | 3202 | int d, d2; |
3201 | 3203 | ||
3202 | /* Cannot change chunk_size, layout, or level */ | 3204 | /* Cannot change chunk_size, layout, or level */ |
3203 | if (mddev->chunk_sectors != mddev->new_chunk_sectors || | 3205 | if (mddev->chunk_sectors != mddev->new_chunk_sectors || |
@@ -3209,11 +3211,8 @@ static int raid1_reshape(struct mddev *mddev) | |||
3209 | return -EINVAL; | 3211 | return -EINVAL; |
3210 | } | 3212 | } |
3211 | 3213 | ||
3212 | if (!mddev_is_clustered(mddev)) { | 3214 | if (!mddev_is_clustered(mddev)) |
3213 | err = md_allow_write(mddev); | 3215 | md_allow_write(mddev); |
3214 | if (err) | ||
3215 | return err; | ||
3216 | } | ||
3217 | 3216 | ||
3218 | raid_disks = mddev->raid_disks + mddev->delta_disks; | 3217 | raid_disks = mddev->raid_disks + mddev->delta_disks; |
3219 | 3218 | ||