diff options
Diffstat (limited to 'drivers/md/raid5.c')
-rw-r--r-- | drivers/md/raid5.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 2930fc26a852..1aebd3ef80b7 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -3703,6 +3703,8 @@ static int make_request(struct request_queue *q, struct bio * bi) | |||
3703 | return 0; | 3703 | return 0; |
3704 | } | 3704 | } |
3705 | 3705 | ||
3706 | static sector_t raid5_size(mddev_t *mddev, sector_t sectors, int raid_disks); | ||
3707 | |||
3706 | static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped) | 3708 | static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped) |
3707 | { | 3709 | { |
3708 | /* reshaping is quite different to recovery/resync so it is | 3710 | /* reshaping is quite different to recovery/resync so it is |
@@ -3781,7 +3783,7 @@ static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped | |||
3781 | j == sh->qd_idx) | 3783 | j == sh->qd_idx) |
3782 | continue; | 3784 | continue; |
3783 | s = compute_blocknr(sh, j); | 3785 | s = compute_blocknr(sh, j); |
3784 | if (s < mddev->array_sectors) { | 3786 | if (s < raid5_size(mddev, 0, 0)) { |
3785 | skipped = 1; | 3787 | skipped = 1; |
3786 | continue; | 3788 | continue; |
3787 | } | 3789 | } |
@@ -4700,6 +4702,9 @@ static int raid5_resize(mddev_t *mddev, sector_t sectors) | |||
4700 | sectors &= ~((sector_t)mddev->chunk_size/512 - 1); | 4702 | sectors &= ~((sector_t)mddev->chunk_size/512 - 1); |
4701 | md_set_array_sectors(mddev, raid5_size(mddev, sectors, | 4703 | md_set_array_sectors(mddev, raid5_size(mddev, sectors, |
4702 | mddev->raid_disks)); | 4704 | mddev->raid_disks)); |
4705 | if (mddev->array_sectors > | ||
4706 | raid5_size(mddev, sectors, mddev->raid_disks)) | ||
4707 | return -EINVAL; | ||
4703 | set_capacity(mddev->gendisk, mddev->array_sectors); | 4708 | set_capacity(mddev->gendisk, mddev->array_sectors); |
4704 | mddev->changed = 1; | 4709 | mddev->changed = 1; |
4705 | if (sectors > mddev->dev_sectors && mddev->recovery_cp == MaxSector) { | 4710 | if (sectors > mddev->dev_sectors && mddev->recovery_cp == MaxSector) { |
@@ -4837,7 +4842,7 @@ static void end_reshape(raid5_conf_t *conf) | |||
4837 | if (!test_bit(MD_RECOVERY_INTR, &conf->mddev->recovery)) { | 4842 | if (!test_bit(MD_RECOVERY_INTR, &conf->mddev->recovery)) { |
4838 | mddev_t *mddev = conf->mddev; | 4843 | mddev_t *mddev = conf->mddev; |
4839 | 4844 | ||
4840 | md_set_array_sectors(mddev, raid5_size(mddev, 0, | 4845 | md_set_array_sectors_lock(mddev, raid5_size(mddev, 0, |
4841 | conf->raid_disks)); | 4846 | conf->raid_disks)); |
4842 | set_capacity(mddev->gendisk, mddev->array_sectors); | 4847 | set_capacity(mddev->gendisk, mddev->array_sectors); |
4843 | mddev->changed = 1; | 4848 | mddev->changed = 1; |