diff options
Diffstat (limited to 'drivers/md/raid1.c')
-rw-r--r-- | drivers/md/raid1.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 4a40a200d769..15dd59b84e94 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -1712,6 +1712,7 @@ static int process_checks(struct r1bio *r1_bio) | |||
1712 | struct r1conf *conf = mddev->private; | 1712 | struct r1conf *conf = mddev->private; |
1713 | int primary; | 1713 | int primary; |
1714 | int i; | 1714 | int i; |
1715 | int vcnt; | ||
1715 | 1716 | ||
1716 | for (primary = 0; primary < conf->raid_disks * 2; primary++) | 1717 | for (primary = 0; primary < conf->raid_disks * 2; primary++) |
1717 | if (r1_bio->bios[primary]->bi_end_io == end_sync_read && | 1718 | if (r1_bio->bios[primary]->bi_end_io == end_sync_read && |
@@ -1721,9 +1722,9 @@ static int process_checks(struct r1bio *r1_bio) | |||
1721 | break; | 1722 | break; |
1722 | } | 1723 | } |
1723 | r1_bio->read_disk = primary; | 1724 | r1_bio->read_disk = primary; |
1725 | vcnt = (r1_bio->sectors + PAGE_SIZE / 512 - 1) >> (PAGE_SHIFT - 9); | ||
1724 | for (i = 0; i < conf->raid_disks * 2; i++) { | 1726 | for (i = 0; i < conf->raid_disks * 2; i++) { |
1725 | int j; | 1727 | int j; |
1726 | int vcnt = r1_bio->sectors >> (PAGE_SHIFT- 9); | ||
1727 | struct bio *pbio = r1_bio->bios[primary]; | 1728 | struct bio *pbio = r1_bio->bios[primary]; |
1728 | struct bio *sbio = r1_bio->bios[i]; | 1729 | struct bio *sbio = r1_bio->bios[i]; |
1729 | int size; | 1730 | int size; |
@@ -1738,7 +1739,7 @@ static int process_checks(struct r1bio *r1_bio) | |||
1738 | s = sbio->bi_io_vec[j].bv_page; | 1739 | s = sbio->bi_io_vec[j].bv_page; |
1739 | if (memcmp(page_address(p), | 1740 | if (memcmp(page_address(p), |
1740 | page_address(s), | 1741 | page_address(s), |
1741 | PAGE_SIZE)) | 1742 | sbio->bi_io_vec[j].bv_len)) |
1742 | break; | 1743 | break; |
1743 | } | 1744 | } |
1744 | } else | 1745 | } else |
@@ -2386,8 +2387,7 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipp | |||
2386 | int ok = 1; | 2387 | int ok = 1; |
2387 | for (i = 0 ; i < conf->raid_disks * 2 ; i++) | 2388 | for (i = 0 ; i < conf->raid_disks * 2 ; i++) |
2388 | if (r1_bio->bios[i]->bi_end_io == end_sync_write) { | 2389 | if (r1_bio->bios[i]->bi_end_io == end_sync_write) { |
2389 | struct md_rdev *rdev = | 2390 | struct md_rdev *rdev = conf->mirrors[i].rdev; |
2390 | rcu_dereference(conf->mirrors[i].rdev); | ||
2391 | ok = rdev_set_badblocks(rdev, sector_nr, | 2391 | ok = rdev_set_badblocks(rdev, sector_nr, |
2392 | min_bad, 0 | 2392 | min_bad, 0 |
2393 | ) && ok; | 2393 | ) && ok; |
@@ -2636,11 +2636,13 @@ static struct r1conf *setup_conf(struct mddev *mddev) | |||
2636 | return ERR_PTR(err); | 2636 | return ERR_PTR(err); |
2637 | } | 2637 | } |
2638 | 2638 | ||
2639 | static int stop(struct mddev *mddev); | ||
2639 | static int run(struct mddev *mddev) | 2640 | static int run(struct mddev *mddev) |
2640 | { | 2641 | { |
2641 | struct r1conf *conf; | 2642 | struct r1conf *conf; |
2642 | int i; | 2643 | int i; |
2643 | struct md_rdev *rdev; | 2644 | struct md_rdev *rdev; |
2645 | int ret; | ||
2644 | 2646 | ||
2645 | if (mddev->level != 1) { | 2647 | if (mddev->level != 1) { |
2646 | printk(KERN_ERR "md/raid1:%s: raid level not set to mirroring (%d)\n", | 2648 | printk(KERN_ERR "md/raid1:%s: raid level not set to mirroring (%d)\n", |
@@ -2705,7 +2707,11 @@ static int run(struct mddev *mddev) | |||
2705 | mddev->queue->backing_dev_info.congested_data = mddev; | 2707 | mddev->queue->backing_dev_info.congested_data = mddev; |
2706 | blk_queue_merge_bvec(mddev->queue, raid1_mergeable_bvec); | 2708 | blk_queue_merge_bvec(mddev->queue, raid1_mergeable_bvec); |
2707 | } | 2709 | } |
2708 | return md_integrity_register(mddev); | 2710 | |
2711 | ret = md_integrity_register(mddev); | ||
2712 | if (ret) | ||
2713 | stop(mddev); | ||
2714 | return ret; | ||
2709 | } | 2715 | } |
2710 | 2716 | ||
2711 | static int stop(struct mddev *mddev) | 2717 | static int stop(struct mddev *mddev) |