aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/raid1.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/raid1.c')
-rw-r--r--drivers/md/raid1.c35
1 files changed, 7 insertions, 28 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index d3d3568b4fb1..fb96c0c2db40 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -497,9 +497,8 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect
497 const sector_t this_sector = r1_bio->sector; 497 const sector_t this_sector = r1_bio->sector;
498 int sectors; 498 int sectors;
499 int best_good_sectors; 499 int best_good_sectors;
500 int start_disk;
501 int best_disk; 500 int best_disk;
502 int i; 501 int disk;
503 sector_t best_dist; 502 sector_t best_dist;
504 struct md_rdev *rdev; 503 struct md_rdev *rdev;
505 int choose_first; 504 int choose_first;
@@ -517,23 +516,16 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect
517 best_good_sectors = 0; 516 best_good_sectors = 0;
518 517
519 if (conf->mddev->recovery_cp < MaxSector && 518 if (conf->mddev->recovery_cp < MaxSector &&
520 (this_sector + sectors >= conf->next_resync)) { 519 (this_sector + sectors >= conf->next_resync))
521 choose_first = 1; 520 choose_first = 1;
522 start_disk = 0; 521 else
523 } else {
524 choose_first = 0; 522 choose_first = 0;
525 start_disk = conf->last_used;
526 }
527 523
528 for (i = 0 ; i < conf->raid_disks * 2 ; i++) { 524 for (disk = 0 ; disk < conf->raid_disks * 2 ; disk++) {
529 sector_t dist; 525 sector_t dist;
530 sector_t first_bad; 526 sector_t first_bad;
531 int bad_sectors; 527 int bad_sectors;
532 528
533 int disk = start_disk + i;
534 if (disk >= conf->raid_disks * 2)
535 disk -= conf->raid_disks * 2;
536
537 rdev = rcu_dereference(conf->mirrors[disk].rdev); 529 rdev = rcu_dereference(conf->mirrors[disk].rdev);
538 if (r1_bio->bios[disk] == IO_BLOCKED 530 if (r1_bio->bios[disk] == IO_BLOCKED
539 || rdev == NULL 531 || rdev == NULL
@@ -594,7 +586,7 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect
594 dist = abs(this_sector - conf->mirrors[disk].head_position); 586 dist = abs(this_sector - conf->mirrors[disk].head_position);
595 if (choose_first 587 if (choose_first
596 /* Don't change to another disk for sequential reads */ 588 /* Don't change to another disk for sequential reads */
597 || conf->next_seq_sect == this_sector 589 || conf->mirrors[disk].next_seq_sect == this_sector
598 || dist == 0 590 || dist == 0
599 /* If device is idle, use it */ 591 /* If device is idle, use it */
600 || atomic_read(&rdev->nr_pending) == 0) { 592 || atomic_read(&rdev->nr_pending) == 0) {
@@ -620,8 +612,7 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect
620 goto retry; 612 goto retry;
621 } 613 }
622 sectors = best_good_sectors; 614 sectors = best_good_sectors;
623 conf->next_seq_sect = this_sector + sectors; 615 conf->mirrors[best_disk].next_seq_sect = this_sector + sectors;
624 conf->last_used = best_disk;
625 } 616 }
626 rcu_read_unlock(); 617 rcu_read_unlock();
627 *max_sectors = sectors; 618 *max_sectors = sectors;
@@ -2599,7 +2590,6 @@ static struct r1conf *setup_conf(struct mddev *mddev)
2599 conf->recovery_disabled = mddev->recovery_disabled - 1; 2590 conf->recovery_disabled = mddev->recovery_disabled - 1;
2600 2591
2601 err = -EIO; 2592 err = -EIO;
2602 conf->last_used = -1;
2603 for (i = 0; i < conf->raid_disks * 2; i++) { 2593 for (i = 0; i < conf->raid_disks * 2; i++) {
2604 2594
2605 disk = conf->mirrors + i; 2595 disk = conf->mirrors + i;
@@ -2625,19 +2615,9 @@ static struct r1conf *setup_conf(struct mddev *mddev)
2625 if (disk->rdev && 2615 if (disk->rdev &&
2626 (disk->rdev->saved_raid_disk < 0)) 2616 (disk->rdev->saved_raid_disk < 0))
2627 conf->fullsync = 1; 2617 conf->fullsync = 1;
2628 } else if (conf->last_used < 0) 2618 }
2629 /*
2630 * The first working device is used as a
2631 * starting point to read balancing.
2632 */
2633 conf->last_used = i;
2634 } 2619 }
2635 2620
2636 if (conf->last_used < 0) {
2637 printk(KERN_ERR "md/raid1:%s: no operational mirrors\n",
2638 mdname(mddev));
2639 goto abort;
2640 }
2641 err = -ENOMEM; 2621 err = -ENOMEM;
2642 conf->thread = md_register_thread(raid1d, mddev, "raid1"); 2622 conf->thread = md_register_thread(raid1d, mddev, "raid1");
2643 if (!conf->thread) { 2623 if (!conf->thread) {
@@ -2894,7 +2874,6 @@ static int raid1_reshape(struct mddev *mddev)
2894 conf->raid_disks = mddev->raid_disks = raid_disks; 2874 conf->raid_disks = mddev->raid_disks = raid_disks;
2895 mddev->delta_disks = 0; 2875 mddev->delta_disks = 0;
2896 2876
2897 conf->last_used = 0; /* just make sure it is in-range */
2898 lower_barrier(conf); 2877 lower_barrier(conf);
2899 2878
2900 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 2879 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);