diff options
Diffstat (limited to 'drivers/md/raid10.c')
-rw-r--r-- | drivers/md/raid10.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index bbe40e9cf923..26114f40bde6 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -496,6 +496,7 @@ static int read_balance(conf_t *conf, r10bio_t *r10_bio) | |||
496 | int disk, slot, nslot; | 496 | int disk, slot, nslot; |
497 | const int sectors = r10_bio->sectors; | 497 | const int sectors = r10_bio->sectors; |
498 | sector_t new_distance, current_distance; | 498 | sector_t new_distance, current_distance; |
499 | mdk_rdev_t *rdev; | ||
499 | 500 | ||
500 | raid10_find_phys(conf, r10_bio); | 501 | raid10_find_phys(conf, r10_bio); |
501 | rcu_read_lock(); | 502 | rcu_read_lock(); |
@@ -510,8 +511,8 @@ static int read_balance(conf_t *conf, r10bio_t *r10_bio) | |||
510 | slot = 0; | 511 | slot = 0; |
511 | disk = r10_bio->devs[slot].devnum; | 512 | disk = r10_bio->devs[slot].devnum; |
512 | 513 | ||
513 | while (!conf->mirrors[disk].rdev || | 514 | while ((rdev = rcu_dereference(conf->mirrors[disk].rdev)) == NULL || |
514 | !conf->mirrors[disk].rdev->in_sync) { | 515 | !rdev->in_sync) { |
515 | slot++; | 516 | slot++; |
516 | if (slot == conf->copies) { | 517 | if (slot == conf->copies) { |
517 | slot = 0; | 518 | slot = 0; |
@@ -527,8 +528,8 @@ static int read_balance(conf_t *conf, r10bio_t *r10_bio) | |||
527 | /* make sure the disk is operational */ | 528 | /* make sure the disk is operational */ |
528 | slot = 0; | 529 | slot = 0; |
529 | disk = r10_bio->devs[slot].devnum; | 530 | disk = r10_bio->devs[slot].devnum; |
530 | while (!conf->mirrors[disk].rdev || | 531 | while ((rdev=rcu_dereference(conf->mirrors[disk].rdev)) == NULL || |
531 | !conf->mirrors[disk].rdev->in_sync) { | 532 | !rdev->in_sync) { |
532 | slot ++; | 533 | slot ++; |
533 | if (slot == conf->copies) { | 534 | if (slot == conf->copies) { |
534 | disk = -1; | 535 | disk = -1; |
@@ -547,11 +548,11 @@ static int read_balance(conf_t *conf, r10bio_t *r10_bio) | |||
547 | int ndisk = r10_bio->devs[nslot].devnum; | 548 | int ndisk = r10_bio->devs[nslot].devnum; |
548 | 549 | ||
549 | 550 | ||
550 | if (!conf->mirrors[ndisk].rdev || | 551 | if ((rdev=rcu_dereference(conf->mirrors[ndisk].rdev)) == NULL || |
551 | !conf->mirrors[ndisk].rdev->in_sync) | 552 | !rdev->in_sync) |
552 | continue; | 553 | continue; |
553 | 554 | ||
554 | if (!atomic_read(&conf->mirrors[ndisk].rdev->nr_pending)) { | 555 | if (!atomic_read(&rdev->nr_pending)) { |
555 | disk = ndisk; | 556 | disk = ndisk; |
556 | slot = nslot; | 557 | slot = nslot; |
557 | break; | 558 | break; |
@@ -569,7 +570,7 @@ rb_out: | |||
569 | r10_bio->read_slot = slot; | 570 | r10_bio->read_slot = slot; |
570 | /* conf->next_seq_sect = this_sector + sectors;*/ | 571 | /* conf->next_seq_sect = this_sector + sectors;*/ |
571 | 572 | ||
572 | if (disk >= 0 && conf->mirrors[disk].rdev) | 573 | if (disk >= 0 && (rdev=rcu_dereference(conf->mirrors[disk].rdev))!= NULL) |
573 | atomic_inc(&conf->mirrors[disk].rdev->nr_pending); | 574 | atomic_inc(&conf->mirrors[disk].rdev->nr_pending); |
574 | rcu_read_unlock(); | 575 | rcu_read_unlock(); |
575 | 576 | ||
@@ -583,7 +584,7 @@ static void unplug_slaves(mddev_t *mddev) | |||
583 | 584 | ||
584 | rcu_read_lock(); | 585 | rcu_read_lock(); |
585 | for (i=0; i<mddev->raid_disks; i++) { | 586 | for (i=0; i<mddev->raid_disks; i++) { |
586 | mdk_rdev_t *rdev = conf->mirrors[i].rdev; | 587 | mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev); |
587 | if (rdev && !rdev->faulty && atomic_read(&rdev->nr_pending)) { | 588 | if (rdev && !rdev->faulty && atomic_read(&rdev->nr_pending)) { |
588 | request_queue_t *r_queue = bdev_get_queue(rdev->bdev); | 589 | request_queue_t *r_queue = bdev_get_queue(rdev->bdev); |
589 | 590 | ||
@@ -614,7 +615,7 @@ static int raid10_issue_flush(request_queue_t *q, struct gendisk *disk, | |||
614 | 615 | ||
615 | rcu_read_lock(); | 616 | rcu_read_lock(); |
616 | for (i=0; i<mddev->raid_disks && ret == 0; i++) { | 617 | for (i=0; i<mddev->raid_disks && ret == 0; i++) { |
617 | mdk_rdev_t *rdev = conf->mirrors[i].rdev; | 618 | mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev); |
618 | if (rdev && !rdev->faulty) { | 619 | if (rdev && !rdev->faulty) { |
619 | struct block_device *bdev = rdev->bdev; | 620 | struct block_device *bdev = rdev->bdev; |
620 | request_queue_t *r_queue = bdev_get_queue(bdev); | 621 | request_queue_t *r_queue = bdev_get_queue(bdev); |
@@ -768,9 +769,10 @@ static int make_request(request_queue_t *q, struct bio * bio) | |||
768 | rcu_read_lock(); | 769 | rcu_read_lock(); |
769 | for (i = 0; i < conf->copies; i++) { | 770 | for (i = 0; i < conf->copies; i++) { |
770 | int d = r10_bio->devs[i].devnum; | 771 | int d = r10_bio->devs[i].devnum; |
771 | if (conf->mirrors[d].rdev && | 772 | mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[d].rdev); |
772 | !conf->mirrors[d].rdev->faulty) { | 773 | if (rdev && |
773 | atomic_inc(&conf->mirrors[d].rdev->nr_pending); | 774 | !rdev->faulty) { |
775 | atomic_inc(&rdev->nr_pending); | ||
774 | r10_bio->devs[i].bio = bio; | 776 | r10_bio->devs[i].bio = bio; |
775 | } else | 777 | } else |
776 | r10_bio->devs[i].bio = NULL; | 778 | r10_bio->devs[i].bio = NULL; |
@@ -980,7 +982,7 @@ static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) | |||
980 | p->head_position = 0; | 982 | p->head_position = 0; |
981 | rdev->raid_disk = mirror; | 983 | rdev->raid_disk = mirror; |
982 | found = 1; | 984 | found = 1; |
983 | p->rdev = rdev; | 985 | rcu_assign_pointer(p->rdev, rdev); |
984 | break; | 986 | break; |
985 | } | 987 | } |
986 | 988 | ||