28
29
static int raid0_congested(void *data, int bits)
30
mddev_t *mddev = data;
31
raid0_conf_t *conf = mddev->private;
32
mdk_rdev_t **devlist = conf->devlist;
31
struct mddev *mddev = data;
32
struct r0conf *conf = mddev->private;
33
struct md_rdev **devlist = conf->devlist;
33
34
int raid_disks = conf->strip_zone[0].nb_dev;
48
49
* inform the user of the raid configuration
50
static void dump_zones(mddev_t *mddev)
51
static void dump_zones(struct mddev *mddev)
53
54
sector_t zone_size = 0;
54
55
sector_t zone_start = 0;
55
56
char b[BDEVNAME_SIZE];
56
raid0_conf_t *conf = mddev->private;
57
struct r0conf *conf = mddev->private;
57
58
int raid_disks = conf->strip_zone[0].nb_dev;
58
printk(KERN_INFO "******* %s configuration *********\n",
59
printk(KERN_INFO "md: RAID0 configuration for %s - %d zone%s\n",
61
conf->nr_strip_zones, conf->nr_strip_zones==1?"":"s");
61
62
for (j = 0; j < conf->nr_strip_zones; j++) {
62
printk(KERN_INFO "zone%d=[", j);
63
printk(KERN_INFO "md: zone%d=[", j);
63
64
for (k = 0; k < conf->strip_zone[j].nb_dev; k++)
64
printk(KERN_CONT "%s/",
65
printk(KERN_CONT "%s%s", k?"/":"",
65
66
bdevname(conf->devlist[j*raid_disks
67
68
printk(KERN_CONT "]\n");
69
70
zone_size = conf->strip_zone[j].zone_end - zone_start;
70
printk(KERN_INFO " zone offset=%llukb "
71
"device offset=%llukb size=%llukb\n",
71
printk(KERN_INFO " zone-offset=%10lluKB, "
72
"device-offset=%10lluKB, size=%10lluKB\n",
72
73
(unsigned long long)zone_start>>1,
73
74
(unsigned long long)conf->strip_zone[j].dev_start>>1,
74
75
(unsigned long long)zone_size>>1);
75
76
zone_start = conf->strip_zone[j].zone_end;
77
printk(KERN_INFO "**********************************\n\n");
78
printk(KERN_INFO "\n");
80
static int create_strip_zones(mddev_t *mddev, raid0_conf_t **private_conf)
81
static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
83
84
sector_t curr_zone_end, sectors;
84
mdk_rdev_t *smallest, *rdev1, *rdev2, *rdev, **dev;
85
struct md_rdev *smallest, *rdev1, *rdev2, *rdev, **dev;
85
86
struct strip_zone *zone;
87
88
char b[BDEVNAME_SIZE];
88
raid0_conf_t *conf = kzalloc(sizeof(*conf), GFP_KERNEL);
89
char b2[BDEVNAME_SIZE];
90
struct r0conf *conf = kzalloc(sizeof(*conf), GFP_KERNEL);
92
94
list_for_each_entry(rdev1, &mddev->disks, same_set) {
93
printk(KERN_INFO "md/raid0:%s: looking at %s\n",
95
bdevname(rdev1->bdev, b));
95
pr_debug("md/raid0:%s: looking at %s\n",
97
bdevname(rdev1->bdev, b));
98
100
/* round size to chunk_size */
101
103
rdev1->sectors = sectors * mddev->chunk_sectors;
103
105
list_for_each_entry(rdev2, &mddev->disks, same_set) {
104
printk(KERN_INFO "md/raid0:%s: comparing %s(%llu)",
106
bdevname(rdev1->bdev,b),
107
(unsigned long long)rdev1->sectors);
108
printk(KERN_CONT " with %s(%llu)\n",
109
bdevname(rdev2->bdev,b),
110
(unsigned long long)rdev2->sectors);
106
pr_debug("md/raid0:%s: comparing %s(%llu)"
109
bdevname(rdev1->bdev,b),
110
(unsigned long long)rdev1->sectors,
111
bdevname(rdev2->bdev,b2),
112
(unsigned long long)rdev2->sectors);
111
113
if (rdev2 == rdev1) {
112
printk(KERN_INFO "md/raid0:%s: END\n",
114
pr_debug("md/raid0:%s: END\n",
116
118
if (rdev2->sectors == rdev1->sectors) {
118
120
* Not unique, don't count it as a new
121
printk(KERN_INFO "md/raid0:%s: EQUAL\n",
123
pr_debug("md/raid0:%s: EQUAL\n",
126
printk(KERN_INFO "md/raid0:%s: NOT EQUAL\n",
128
pr_debug("md/raid0:%s: NOT EQUAL\n",
130
printk(KERN_INFO "md/raid0:%s: ==> UNIQUE\n",
132
pr_debug("md/raid0:%s: ==> UNIQUE\n",
132
134
conf->nr_strip_zones++;
133
printk(KERN_INFO "md/raid0:%s: %d zones\n",
134
mdname(mddev), conf->nr_strip_zones);
135
pr_debug("md/raid0:%s: %d zones\n",
136
mdname(mddev), conf->nr_strip_zones);
137
printk(KERN_INFO "md/raid0:%s: FINAL %d zones\n",
138
mdname(mddev), conf->nr_strip_zones);
139
pr_debug("md/raid0:%s: FINAL %d zones\n",
140
mdname(mddev), conf->nr_strip_zones);
140
142
conf->strip_zone = kzalloc(sizeof(struct strip_zone)*
141
143
conf->nr_strip_zones, GFP_KERNEL);
142
144
if (!conf->strip_zone)
144
conf->devlist = kzalloc(sizeof(mdk_rdev_t*)*
146
conf->devlist = kzalloc(sizeof(struct md_rdev*)*
145
147
conf->nr_strip_zones*mddev->raid_disks,
147
149
if (!conf->devlist)
218
220
zone = conf->strip_zone + i;
219
221
dev = conf->devlist + i * mddev->raid_disks;
221
printk(KERN_INFO "md/raid0:%s: zone %d\n",
223
pr_debug("md/raid0:%s: zone %d\n", mdname(mddev), i);
223
224
zone->dev_start = smallest->sectors;
227
228
for (j=0; j<cnt; j++) {
228
229
rdev = conf->devlist[j];
229
printk(KERN_INFO "md/raid0:%s: checking %s ...",
231
bdevname(rdev->bdev, b));
232
230
if (rdev->sectors <= zone->dev_start) {
233
printk(KERN_CONT " nope.\n");
231
pr_debug("md/raid0:%s: checking %s ... nope\n",
233
bdevname(rdev->bdev, b));
236
printk(KERN_CONT " contained as device %d\n", c);
236
pr_debug("md/raid0:%s: checking %s ..."
237
" contained as device %d\n",
239
bdevname(rdev->bdev, b), c);
239
242
if (!smallest || rdev->sectors < smallest->sectors) {
241
printk(KERN_INFO "md/raid0:%s: (%llu) is smallest!.\n",
243
(unsigned long long)rdev->sectors);
244
pr_debug("md/raid0:%s: (%llu) is smallest!.\n",
246
(unsigned long long)rdev->sectors);
247
250
zone->nb_dev = c;
248
251
sectors = (smallest->sectors - zone->dev_start) * c;
249
printk(KERN_INFO "md/raid0:%s: zone->nb_dev: %d, sectors: %llu\n",
251
zone->nb_dev, (unsigned long long)sectors);
252
pr_debug("md/raid0:%s: zone->nb_dev: %d, sectors: %llu\n",
254
zone->nb_dev, (unsigned long long)sectors);
253
256
curr_zone_end += sectors;
254
257
zone->zone_end = curr_zone_end;
256
printk(KERN_INFO "md/raid0:%s: current zone start: %llu\n",
258
(unsigned long long)smallest->sectors);
259
pr_debug("md/raid0:%s: current zone start: %llu\n",
261
(unsigned long long)smallest->sectors);
260
263
mddev->queue->backing_dev_info.congested_fn = raid0_congested;
261
264
mddev->queue->backing_dev_info.congested_data = mddev;
321
static sector_t raid0_size(mddev_t *mddev, sector_t sectors, int raid_disks)
324
static sector_t raid0_size(struct mddev *mddev, sector_t sectors, int raid_disks)
323
326
sector_t array_sectors = 0;
327
struct md_rdev *rdev;
326
329
WARN_ONCE(sectors || raid_disks,
327
330
"%s does not support generic reshape\n", __func__);
417
420
* remaps the bio to the target device. we separate two flows.
418
421
* power 2 flow and a general flow for the sake of perfromance
420
static mdk_rdev_t *map_sector(mddev_t *mddev, struct strip_zone *zone,
423
static struct md_rdev *map_sector(struct mddev *mddev, struct strip_zone *zone,
421
424
sector_t sector, sector_t *sector_offset)
423
426
unsigned int sect_in_chunk;
425
raid0_conf_t *conf = mddev->private;
428
struct r0conf *conf = mddev->private;
426
429
int raid_disks = conf->strip_zone[0].nb_dev;
427
430
unsigned int chunk_sects = mddev->chunk_sectors;
469
static int raid0_make_request(mddev_t *mddev, struct bio *bio)
472
static void raid0_make_request(struct mddev *mddev, struct bio *bio)
471
474
unsigned int chunk_sects;
472
475
sector_t sector_offset;
473
476
struct strip_zone *zone;
477
struct md_rdev *tmp_dev;
476
479
if (unlikely(bio->bi_rw & REQ_FLUSH)) {
477
480
md_flush_request(mddev, bio);
481
484
chunk_sects = mddev->chunk_sectors;
496
499
bp = bio_split(bio, chunk_sects -
497
500
sector_div(sector, chunk_sects));
498
if (raid0_make_request(mddev, &bp->bio1))
499
generic_make_request(&bp->bio1);
500
if (raid0_make_request(mddev, &bp->bio2))
501
generic_make_request(&bp->bio2);
501
raid0_make_request(mddev, &bp->bio1);
502
raid0_make_request(mddev, &bp->bio2);
503
503
bio_pair_release(bp);
507
507
sector_offset = bio->bi_sector;
523
522
(unsigned long long)bio->bi_sector, bio->bi_size >> 10);
525
524
bio_io_error(bio);
529
static void raid0_status(struct seq_file *seq, mddev_t *mddev)
528
static void raid0_status(struct seq_file *seq, struct mddev *mddev)
534
char b[BDEVNAME_SIZE];
535
raid0_conf_t *conf = mddev->private;
536
int raid_disks = conf->strip_zone[0].nb_dev;
539
sector_t zone_start = 0;
542
for (j = 0; j < conf->nr_strip_zones; j++) {
543
seq_printf(seq, " z%d", j);
544
seq_printf(seq, "=[");
545
for (k = 0; k < conf->strip_zone[j].nb_dev; k++)
546
seq_printf(seq, "%s/", bdevname(
547
conf->devlist[j*raid_disks + k]
550
zone_size = conf->strip_zone[j].zone_end - zone_start;
551
seq_printf(seq, "] ze=%lld ds=%lld s=%lld\n",
552
(unsigned long long)zone_start>>1,
553
(unsigned long long)conf->strip_zone[j].dev_start>>1,
554
(unsigned long long)zone_size>>1);
555
zone_start = conf->strip_zone[j].zone_end;
558
530
seq_printf(seq, " %dk chunks", mddev->chunk_sectors / 2);
562
static void *raid0_takeover_raid45(mddev_t *mddev)
534
static void *raid0_takeover_raid45(struct mddev *mddev)
565
raid0_conf_t *priv_conf;
536
struct md_rdev *rdev;
537
struct r0conf *priv_conf;
567
539
if (mddev->degraded != 1) {
568
540
printk(KERN_ERR "md/raid0:%s: raid5 must be degraded! Degraded disks: %d\n",