aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/linear.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/linear.c')
-rw-r--r--drivers/md/linear.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/drivers/md/linear.c b/drivers/md/linear.c
index 09658b218474..7a36e38393a1 100644
--- a/drivers/md/linear.c
+++ b/drivers/md/linear.c
@@ -16,7 +16,11 @@
16 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 16 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17*/ 17*/
18 18
19#include <linux/raid/linear.h> 19#include <linux/blkdev.h>
20#include <linux/raid/md_u.h>
21#include <linux/seq_file.h>
22#include "md.h"
23#include "linear.h"
20 24
21/* 25/*
22 * find which device holds a particular offset 26 * find which device holds a particular offset
@@ -97,6 +101,16 @@ static int linear_congested(void *data, int bits)
97 return ret; 101 return ret;
98} 102}
99 103
104static sector_t linear_size(mddev_t *mddev, sector_t sectors, int raid_disks)
105{
106 linear_conf_t *conf = mddev_to_conf(mddev);
107
108 WARN_ONCE(sectors || raid_disks,
109 "%s does not support generic reshape\n", __func__);
110
111 return conf->array_sectors;
112}
113
100static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) 114static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
101{ 115{
102 linear_conf_t *conf; 116 linear_conf_t *conf;
@@ -135,8 +149,8 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
135 mddev->queue->max_sectors > (PAGE_SIZE>>9)) 149 mddev->queue->max_sectors > (PAGE_SIZE>>9))
136 blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9); 150 blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9);
137 151
138 disk->num_sectors = rdev->size * 2; 152 disk->num_sectors = rdev->sectors;
139 conf->array_sectors += rdev->size * 2; 153 conf->array_sectors += rdev->sectors;
140 154
141 cnt++; 155 cnt++;
142 } 156 }
@@ -249,7 +263,7 @@ static int linear_run (mddev_t *mddev)
249 if (!conf) 263 if (!conf)
250 return 1; 264 return 1;
251 mddev->private = conf; 265 mddev->private = conf;
252 mddev->array_sectors = conf->array_sectors; 266 md_set_array_sectors(mddev, linear_size(mddev, 0, 0));
253 267
254 blk_queue_merge_bvec(mddev->queue, linear_mergeable_bvec); 268 blk_queue_merge_bvec(mddev->queue, linear_mergeable_bvec);
255 mddev->queue->unplug_fn = linear_unplug; 269 mddev->queue->unplug_fn = linear_unplug;
@@ -283,7 +297,7 @@ static int linear_add(mddev_t *mddev, mdk_rdev_t *rdev)
283 newconf->prev = mddev_to_conf(mddev); 297 newconf->prev = mddev_to_conf(mddev);
284 mddev->private = newconf; 298 mddev->private = newconf;
285 mddev->raid_disks++; 299 mddev->raid_disks++;
286 mddev->array_sectors = newconf->array_sectors; 300 md_set_array_sectors(mddev, linear_size(mddev, 0, 0));
287 set_capacity(mddev->gendisk, mddev->array_sectors); 301 set_capacity(mddev->gendisk, mddev->array_sectors);
288 return 0; 302 return 0;
289} 303}
@@ -381,6 +395,7 @@ static struct mdk_personality linear_personality =
381 .stop = linear_stop, 395 .stop = linear_stop,
382 .status = linear_status, 396 .status = linear_status,
383 .hot_add_disk = linear_add, 397 .hot_add_disk = linear_add,
398 .size = linear_size,
384}; 399};
385 400
386static int __init linear_init (void) 401static int __init linear_init (void)