diff options
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r-- | drivers/md/md.c | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 4c4c79da72b9..158c38f54a40 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -2890,7 +2890,7 @@ size_show(mddev_t *mddev, char *page) | |||
2890 | return sprintf(page, "%llu\n", (unsigned long long)mddev->size); | 2890 | return sprintf(page, "%llu\n", (unsigned long long)mddev->size); |
2891 | } | 2891 | } |
2892 | 2892 | ||
2893 | static int update_size(mddev_t *mddev, unsigned long size); | 2893 | static int update_size(mddev_t *mddev, sector_t num_sectors); |
2894 | 2894 | ||
2895 | static ssize_t | 2895 | static ssize_t |
2896 | size_store(mddev_t *mddev, const char *buf, size_t len) | 2896 | size_store(mddev_t *mddev, const char *buf, size_t len) |
@@ -2907,7 +2907,7 @@ size_store(mddev_t *mddev, const char *buf, size_t len) | |||
2907 | return -EINVAL; | 2907 | return -EINVAL; |
2908 | 2908 | ||
2909 | if (mddev->pers) { | 2909 | if (mddev->pers) { |
2910 | err = update_size(mddev, size); | 2910 | err = update_size(mddev, size * 2); |
2911 | md_update_sb(mddev, 1); | 2911 | md_update_sb(mddev, 1); |
2912 | } else { | 2912 | } else { |
2913 | if (mddev->size == 0 || | 2913 | if (mddev->size == 0 || |
@@ -4617,24 +4617,24 @@ static int set_array_info(mddev_t * mddev, mdu_array_info_t *info) | |||
4617 | return 0; | 4617 | return 0; |
4618 | } | 4618 | } |
4619 | 4619 | ||
4620 | static int update_size(mddev_t *mddev, unsigned long size) | 4620 | static int update_size(mddev_t *mddev, sector_t num_sectors) |
4621 | { | 4621 | { |
4622 | mdk_rdev_t * rdev; | 4622 | mdk_rdev_t * rdev; |
4623 | int rv; | 4623 | int rv; |
4624 | struct list_head *tmp; | 4624 | struct list_head *tmp; |
4625 | int fit = (size == 0); | 4625 | int fit = (num_sectors == 0); |
4626 | 4626 | ||
4627 | if (mddev->pers->resize == NULL) | 4627 | if (mddev->pers->resize == NULL) |
4628 | return -EINVAL; | 4628 | return -EINVAL; |
4629 | /* The "size" is the amount of each device that is used. | 4629 | /* The "num_sectors" is the number of sectors of each device that |
4630 | * This can only make sense for arrays with redundancy. | 4630 | * is used. This can only make sense for arrays with redundancy. |
4631 | * linear and raid0 always use whatever space is available | 4631 | * linear and raid0 always use whatever space is available. We can only |
4632 | * We can only consider changing the size if no resync | 4632 | * consider changing this number if no resync or reconstruction is |
4633 | * or reconstruction is happening, and if the new size | 4633 | * happening, and if the new size is acceptable. It must fit before the |
4634 | * is acceptable. It must fit before the sb_offset or, | 4634 | * sb_offset or, if that is <data_offset, it must fit before the size |
4635 | * if that is <data_offset, it must fit before the | 4635 | * of each device. If num_sectors is zero, we find the largest size |
4636 | * size of each device. | 4636 | * that fits. |
4637 | * If size is zero, we find the largest size that fits. | 4637 | |
4638 | */ | 4638 | */ |
4639 | if (mddev->sync_thread) | 4639 | if (mddev->sync_thread) |
4640 | return -EBUSY; | 4640 | return -EBUSY; |
@@ -4642,12 +4642,12 @@ static int update_size(mddev_t *mddev, unsigned long size) | |||
4642 | sector_t avail; | 4642 | sector_t avail; |
4643 | avail = rdev->size * 2; | 4643 | avail = rdev->size * 2; |
4644 | 4644 | ||
4645 | if (fit && (size == 0 || size > avail/2)) | 4645 | if (fit && (num_sectors == 0 || num_sectors > avail)) |
4646 | size = avail/2; | 4646 | num_sectors = avail; |
4647 | if (avail < ((sector_t)size << 1)) | 4647 | if (avail < num_sectors) |
4648 | return -ENOSPC; | 4648 | return -ENOSPC; |
4649 | } | 4649 | } |
4650 | rv = mddev->pers->resize(mddev, (sector_t)size *2); | 4650 | rv = mddev->pers->resize(mddev, num_sectors); |
4651 | if (!rv) { | 4651 | if (!rv) { |
4652 | struct block_device *bdev; | 4652 | struct block_device *bdev; |
4653 | 4653 | ||
@@ -4729,7 +4729,7 @@ static int update_array_info(mddev_t *mddev, mdu_array_info_t *info) | |||
4729 | return mddev->pers->reconfig(mddev, info->layout, -1); | 4729 | return mddev->pers->reconfig(mddev, info->layout, -1); |
4730 | } | 4730 | } |
4731 | if (info->size >= 0 && mddev->size != info->size) | 4731 | if (info->size >= 0 && mddev->size != info->size) |
4732 | rv = update_size(mddev, info->size); | 4732 | rv = update_size(mddev, (sector_t)info->size * 2); |
4733 | 4733 | ||
4734 | if (mddev->raid_disks != info->raid_disks) | 4734 | if (mddev->raid_disks != info->raid_disks) |
4735 | rv = update_raid_disks(mddev, info->raid_disks); | 4735 | rv = update_raid_disks(mddev, info->raid_disks); |