diff options
Diffstat (limited to 'drivers/md/raid10.c')
-rw-r--r-- | drivers/md/raid10.c | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 99c9207899a7..c5e6c60fc0d4 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -141,7 +141,7 @@ static void r10bio_pool_free(void *r10_bio, void *data) | |||
141 | #define RESYNC_WINDOW (1024*1024) | 141 | #define RESYNC_WINDOW (1024*1024) |
142 | /* maximum number of concurrent requests, memory permitting */ | 142 | /* maximum number of concurrent requests, memory permitting */ |
143 | #define RESYNC_DEPTH (32*1024*1024/RESYNC_BLOCK_SIZE) | 143 | #define RESYNC_DEPTH (32*1024*1024/RESYNC_BLOCK_SIZE) |
144 | #define CLUSTER_RESYNC_WINDOW (16 * RESYNC_WINDOW) | 144 | #define CLUSTER_RESYNC_WINDOW (32 * RESYNC_WINDOW) |
145 | #define CLUSTER_RESYNC_WINDOW_SECTORS (CLUSTER_RESYNC_WINDOW >> 9) | 145 | #define CLUSTER_RESYNC_WINDOW_SECTORS (CLUSTER_RESYNC_WINDOW >> 9) |
146 | 146 | ||
147 | /* | 147 | /* |
@@ -2655,7 +2655,8 @@ static void handle_write_completed(struct r10conf *conf, struct r10bio *r10_bio) | |||
2655 | for (m = 0; m < conf->copies; m++) { | 2655 | for (m = 0; m < conf->copies; m++) { |
2656 | int dev = r10_bio->devs[m].devnum; | 2656 | int dev = r10_bio->devs[m].devnum; |
2657 | rdev = conf->mirrors[dev].rdev; | 2657 | rdev = conf->mirrors[dev].rdev; |
2658 | if (r10_bio->devs[m].bio == NULL) | 2658 | if (r10_bio->devs[m].bio == NULL || |
2659 | r10_bio->devs[m].bio->bi_end_io == NULL) | ||
2659 | continue; | 2660 | continue; |
2660 | if (!r10_bio->devs[m].bio->bi_status) { | 2661 | if (!r10_bio->devs[m].bio->bi_status) { |
2661 | rdev_clear_badblocks( | 2662 | rdev_clear_badblocks( |
@@ -2670,7 +2671,8 @@ static void handle_write_completed(struct r10conf *conf, struct r10bio *r10_bio) | |||
2670 | md_error(conf->mddev, rdev); | 2671 | md_error(conf->mddev, rdev); |
2671 | } | 2672 | } |
2672 | rdev = conf->mirrors[dev].replacement; | 2673 | rdev = conf->mirrors[dev].replacement; |
2673 | if (r10_bio->devs[m].repl_bio == NULL) | 2674 | if (r10_bio->devs[m].repl_bio == NULL || |
2675 | r10_bio->devs[m].repl_bio->bi_end_io == NULL) | ||
2674 | continue; | 2676 | continue; |
2675 | 2677 | ||
2676 | if (!r10_bio->devs[m].repl_bio->bi_status) { | 2678 | if (!r10_bio->devs[m].repl_bio->bi_status) { |
@@ -3782,7 +3784,7 @@ static int raid10_run(struct mddev *mddev) | |||
3782 | if (fc > 1 || fo > 0) { | 3784 | if (fc > 1 || fo > 0) { |
3783 | pr_err("only near layout is supported by clustered" | 3785 | pr_err("only near layout is supported by clustered" |
3784 | " raid10\n"); | 3786 | " raid10\n"); |
3785 | goto out; | 3787 | goto out_free_conf; |
3786 | } | 3788 | } |
3787 | } | 3789 | } |
3788 | 3790 | ||
@@ -4830,17 +4832,11 @@ static void raid10_finish_reshape(struct mddev *mddev) | |||
4830 | return; | 4832 | return; |
4831 | 4833 | ||
4832 | if (mddev->delta_disks > 0) { | 4834 | if (mddev->delta_disks > 0) { |
4833 | sector_t size = raid10_size(mddev, 0, 0); | ||
4834 | md_set_array_sectors(mddev, size); | ||
4835 | if (mddev->recovery_cp > mddev->resync_max_sectors) { | 4835 | if (mddev->recovery_cp > mddev->resync_max_sectors) { |
4836 | mddev->recovery_cp = mddev->resync_max_sectors; | 4836 | mddev->recovery_cp = mddev->resync_max_sectors; |
4837 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | 4837 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); |
4838 | } | 4838 | } |
4839 | mddev->resync_max_sectors = size; | 4839 | mddev->resync_max_sectors = mddev->array_sectors; |
4840 | if (mddev->queue) { | ||
4841 | set_capacity(mddev->gendisk, mddev->array_sectors); | ||
4842 | revalidate_disk(mddev->gendisk); | ||
4843 | } | ||
4844 | } else { | 4840 | } else { |
4845 | int d; | 4841 | int d; |
4846 | rcu_read_lock(); | 4842 | rcu_read_lock(); |