diff options
author | Dan Williams <dan.j.williams@intel.com> | 2009-03-17 18:10:40 -0700 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2009-03-31 14:57:49 +1100 |
commit | 80c3a6ce4ba4470379b9e6a4d9bcd9d2ee26ae03 (patch) | |
tree | de88622f05a7e681ac7bff7714e8f2d8953b66ac /drivers/md/raid0.c | |
parent | 93ed05e2a56b5ee06c0100a169433b11c4aa5d0b (diff) | |
download | kernel_goldelico_gta04-80c3a6ce4ba4470379b9e6a4d9bcd9d2ee26ae03.zip kernel_goldelico_gta04-80c3a6ce4ba4470379b9e6a4d9bcd9d2ee26ae03.tar.gz kernel_goldelico_gta04-80c3a6ce4ba4470379b9e6a4d9bcd9d2ee26ae03.tar.bz2 |
md: add 'size' as a personality method
In preparation for giving userspace control over ->array_sectors we need
to be able to retrieve the 'default' size, and the 'anticipated' size
when a reshape is requested. For personalities that do not reshape emit
a warning if anything but the default size is requested.
In the raid5 case we need to update ->previous_raid_disks to make the
new 'default' size available.
Reviewed-by: Andre Noll <maan@systemlinux.org>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers/md/raid0.c')
-rw-r--r-- | drivers/md/raid0.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index 9aebb4c..bb0df6a 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -263,12 +263,25 @@ static int raid0_mergeable_bvec(struct request_queue *q, return max; } +static sector_t raid0_size(mddev_t *mddev, sector_t sectors, int raid_disks) +{ + sector_t array_sectors = 0; + mdk_rdev_t *rdev; + + WARN_ONCE(sectors || raid_disks, + "%s does not support generic reshape\n", __func__); + + list_for_each_entry(rdev, &mddev->disks, same_set) + array_sectors += rdev->sectors; + + return array_sectors; +} + static int raid0_run (mddev_t *mddev) { unsigned cur=0, i=0, nb_zone; s64 sectors; raid0_conf_t *conf; - mdk_rdev_t *rdev; if (mddev->chunk_size == 0) { printk(KERN_ERR "md/raid0: non-zero chunk size required.\n"); @@ -293,9 +306,7 @@ static int raid0_run (mddev_t *mddev) goto out_free_conf; /* calculate array device size */ - mddev->array_sectors = 0; - list_for_each_entry(rdev, &mddev->disks, same_set) - mddev->array_sectors += rdev->sectors; + mddev->array_sectors = raid0_size(mddev, 0, 0); printk(KERN_INFO "raid0 : md_size is %llu sectors.\n", (unsigned long long)mddev->array_sectors); @@ -511,6 +522,7 @@ static struct mdk_personality raid0_personality= .run = raid0_run, .stop = raid0_stop, .status = raid0_status, + .size = raid0_size, }; static int __init raid0_init (void) |