]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - drivers/md/raid0.c
UBUNTU: Ubuntu-5.15.0-39.42
[mirror_ubuntu-jammy-kernel.git] / drivers / md / raid0.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 raid0.c : Multiple Devices driver for Linux
4 Copyright (C) 1994-96 Marc ZYNGIER
5 <zyngier@ufr-info-p7.ibp.fr> or
6 <maz@gloups.fdn.fr>
7 Copyright (C) 1999, 2000 Ingo Molnar, Red Hat
8
9 RAID-0 management functions.
10
11 */
12
13 #include <linux/blkdev.h>
14 #include <linux/seq_file.h>
15 #include <linux/module.h>
16 #include <linux/slab.h>
17 #include <trace/events/block.h>
18 #include "md.h"
19 #include "raid0.h"
20 #include "raid5.h"
21
22 static int default_layout = 0;
23 module_param(default_layout, int, 0644);
24
25 #define UNSUPPORTED_MDDEV_FLAGS \
26 ((1L << MD_HAS_JOURNAL) | \
27 (1L << MD_JOURNAL_CLEAN) | \
28 (1L << MD_FAILFAST_SUPPORTED) |\
29 (1L << MD_HAS_PPL) | \
30 (1L << MD_HAS_MULTIPLE_PPLS))
31
32 /*
33 * inform the user of the raid configuration
34 */
35 static void dump_zones(struct mddev *mddev)
36 {
37 int j, k;
38 sector_t zone_size = 0;
39 sector_t zone_start = 0;
40 char b[BDEVNAME_SIZE];
41 struct r0conf *conf = mddev->private;
42 int raid_disks = conf->strip_zone[0].nb_dev;
43 pr_debug("md: RAID0 configuration for %s - %d zone%s\n",
44 mdname(mddev),
45 conf->nr_strip_zones, conf->nr_strip_zones==1?"":"s");
46 for (j = 0; j < conf->nr_strip_zones; j++) {
47 char line[200];
48 int len = 0;
49
50 for (k = 0; k < conf->strip_zone[j].nb_dev; k++)
51 len += snprintf(line+len, 200-len, "%s%s", k?"/":"",
52 bdevname(conf->devlist[j*raid_disks
53 + k]->bdev, b));
54 pr_debug("md: zone%d=[%s]\n", j, line);
55
56 zone_size = conf->strip_zone[j].zone_end - zone_start;
57 pr_debug(" zone-offset=%10lluKB, device-offset=%10lluKB, size=%10lluKB\n",
58 (unsigned long long)zone_start>>1,
59 (unsigned long long)conf->strip_zone[j].dev_start>>1,
60 (unsigned long long)zone_size>>1);
61 zone_start = conf->strip_zone[j].zone_end;
62 }
63 }
64
65 static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
66 {
67 int i, c, err;
68 sector_t curr_zone_end, sectors;
69 struct md_rdev *smallest, *rdev1, *rdev2, *rdev, **dev;
70 struct strip_zone *zone;
71 int cnt;
72 char b[BDEVNAME_SIZE];
73 char b2[BDEVNAME_SIZE];
74 struct r0conf *conf = kzalloc(sizeof(*conf), GFP_KERNEL);
75 unsigned blksize = 512;
76
77 *private_conf = ERR_PTR(-ENOMEM);
78 if (!conf)
79 return -ENOMEM;
80 rdev_for_each(rdev1, mddev) {
81 pr_debug("md/raid0:%s: looking at %s\n",
82 mdname(mddev),
83 bdevname(rdev1->bdev, b));
84 c = 0;
85
86 /* round size to chunk_size */
87 sectors = rdev1->sectors;
88 sector_div(sectors, mddev->chunk_sectors);
89 rdev1->sectors = sectors * mddev->chunk_sectors;
90
91 blksize = max(blksize, queue_logical_block_size(
92 rdev1->bdev->bd_disk->queue));
93
94 rdev_for_each(rdev2, mddev) {
95 pr_debug("md/raid0:%s: comparing %s(%llu)"
96 " with %s(%llu)\n",
97 mdname(mddev),
98 bdevname(rdev1->bdev,b),
99 (unsigned long long)rdev1->sectors,
100 bdevname(rdev2->bdev,b2),
101 (unsigned long long)rdev2->sectors);
102 if (rdev2 == rdev1) {
103 pr_debug("md/raid0:%s: END\n",
104 mdname(mddev));
105 break;
106 }
107 if (rdev2->sectors == rdev1->sectors) {
108 /*
109 * Not unique, don't count it as a new
110 * group
111 */
112 pr_debug("md/raid0:%s: EQUAL\n",
113 mdname(mddev));
114 c = 1;
115 break;
116 }
117 pr_debug("md/raid0:%s: NOT EQUAL\n",
118 mdname(mddev));
119 }
120 if (!c) {
121 pr_debug("md/raid0:%s: ==> UNIQUE\n",
122 mdname(mddev));
123 conf->nr_strip_zones++;
124 pr_debug("md/raid0:%s: %d zones\n",
125 mdname(mddev), conf->nr_strip_zones);
126 }
127 }
128 pr_debug("md/raid0:%s: FINAL %d zones\n",
129 mdname(mddev), conf->nr_strip_zones);
130
131 if (conf->nr_strip_zones == 1) {
132 conf->layout = RAID0_ORIG_LAYOUT;
133 } else if (mddev->layout == RAID0_ORIG_LAYOUT ||
134 mddev->layout == RAID0_ALT_MULTIZONE_LAYOUT) {
135 conf->layout = mddev->layout;
136 } else if (default_layout == RAID0_ORIG_LAYOUT ||
137 default_layout == RAID0_ALT_MULTIZONE_LAYOUT) {
138 conf->layout = default_layout;
139 } else {
140 conf->layout = RAID0_ALT_MULTIZONE_LAYOUT;
141 pr_warn("md/raid0:%s: !!! DEFAULTING TO ALTERNATE LAYOUT !!!\n",
142 mdname(mddev));
143 pr_warn("md/raid0: Please set raid0.default_layout to 1 or 2\n");
144 pr_warn("md/raid0: Read the following page for more information:\n");
145 pr_warn("md/raid0: https://wiki.ubuntu.com/Kernel/Raid0LayoutMigration\n");
146 }
147 /*
148 * now since we have the hard sector sizes, we can make sure
149 * chunk size is a multiple of that sector size
150 */
151 if ((mddev->chunk_sectors << 9) % blksize) {
152 pr_warn("md/raid0:%s: chunk_size of %d not multiple of block size %d\n",
153 mdname(mddev),
154 mddev->chunk_sectors << 9, blksize);
155 err = -EINVAL;
156 goto abort;
157 }
158
159 err = -ENOMEM;
160 conf->strip_zone = kcalloc(conf->nr_strip_zones,
161 sizeof(struct strip_zone),
162 GFP_KERNEL);
163 if (!conf->strip_zone)
164 goto abort;
165 conf->devlist = kzalloc(array3_size(sizeof(struct md_rdev *),
166 conf->nr_strip_zones,
167 mddev->raid_disks),
168 GFP_KERNEL);
169 if (!conf->devlist)
170 goto abort;
171
172 /* The first zone must contain all devices, so here we check that
173 * there is a proper alignment of slots to devices and find them all
174 */
175 zone = &conf->strip_zone[0];
176 cnt = 0;
177 smallest = NULL;
178 dev = conf->devlist;
179 err = -EINVAL;
180 rdev_for_each(rdev1, mddev) {
181 int j = rdev1->raid_disk;
182
183 if (mddev->level == 10) {
184 /* taking over a raid10-n2 array */
185 j /= 2;
186 rdev1->new_raid_disk = j;
187 }
188
189 if (mddev->level == 1) {
190 /* taiking over a raid1 array-
191 * we have only one active disk
192 */
193 j = 0;
194 rdev1->new_raid_disk = j;
195 }
196
197 if (j < 0) {
198 pr_warn("md/raid0:%s: remove inactive devices before converting to RAID0\n",
199 mdname(mddev));
200 goto abort;
201 }
202 if (j >= mddev->raid_disks) {
203 pr_warn("md/raid0:%s: bad disk number %d - aborting!\n",
204 mdname(mddev), j);
205 goto abort;
206 }
207 if (dev[j]) {
208 pr_warn("md/raid0:%s: multiple devices for %d - aborting!\n",
209 mdname(mddev), j);
210 goto abort;
211 }
212 dev[j] = rdev1;
213
214 if (!smallest || (rdev1->sectors < smallest->sectors))
215 smallest = rdev1;
216 cnt++;
217 }
218 if (cnt != mddev->raid_disks) {
219 pr_warn("md/raid0:%s: too few disks (%d of %d) - aborting!\n",
220 mdname(mddev), cnt, mddev->raid_disks);
221 goto abort;
222 }
223 zone->nb_dev = cnt;
224 zone->zone_end = smallest->sectors * cnt;
225
226 curr_zone_end = zone->zone_end;
227
228 /* now do the other zones */
229 for (i = 1; i < conf->nr_strip_zones; i++)
230 {
231 int j;
232
233 zone = conf->strip_zone + i;
234 dev = conf->devlist + i * mddev->raid_disks;
235
236 pr_debug("md/raid0:%s: zone %d\n", mdname(mddev), i);
237 zone->dev_start = smallest->sectors;
238 smallest = NULL;
239 c = 0;
240
241 for (j=0; j<cnt; j++) {
242 rdev = conf->devlist[j];
243 if (rdev->sectors <= zone->dev_start) {
244 pr_debug("md/raid0:%s: checking %s ... nope\n",
245 mdname(mddev),
246 bdevname(rdev->bdev, b));
247 continue;
248 }
249 pr_debug("md/raid0:%s: checking %s ..."
250 " contained as device %d\n",
251 mdname(mddev),
252 bdevname(rdev->bdev, b), c);
253 dev[c] = rdev;
254 c++;
255 if (!smallest || rdev->sectors < smallest->sectors) {
256 smallest = rdev;
257 pr_debug("md/raid0:%s: (%llu) is smallest!.\n",
258 mdname(mddev),
259 (unsigned long long)rdev->sectors);
260 }
261 }
262
263 zone->nb_dev = c;
264 sectors = (smallest->sectors - zone->dev_start) * c;
265 pr_debug("md/raid0:%s: zone->nb_dev: %d, sectors: %llu\n",
266 mdname(mddev),
267 zone->nb_dev, (unsigned long long)sectors);
268
269 curr_zone_end += sectors;
270 zone->zone_end = curr_zone_end;
271
272 pr_debug("md/raid0:%s: current zone start: %llu\n",
273 mdname(mddev),
274 (unsigned long long)smallest->sectors);
275 }
276
277 pr_debug("md/raid0:%s: done.\n", mdname(mddev));
278 *private_conf = conf;
279
280 return 0;
281 abort:
282 kfree(conf->strip_zone);
283 kfree(conf->devlist);
284 kfree(conf);
285 *private_conf = ERR_PTR(err);
286 return err;
287 }
288
289 /* Find the zone which holds a particular offset
290 * Update *sectorp to be an offset in that zone
291 */
292 static struct strip_zone *find_zone(struct r0conf *conf,
293 sector_t *sectorp)
294 {
295 int i;
296 struct strip_zone *z = conf->strip_zone;
297 sector_t sector = *sectorp;
298
299 for (i = 0; i < conf->nr_strip_zones; i++)
300 if (sector < z[i].zone_end) {
301 if (i)
302 *sectorp = sector - z[i-1].zone_end;
303 return z + i;
304 }
305 BUG();
306 }
307
308 /*
309 * remaps the bio to the target device. we separate two flows.
310 * power 2 flow and a general flow for the sake of performance
311 */
312 static struct md_rdev *map_sector(struct mddev *mddev, struct strip_zone *zone,
313 sector_t sector, sector_t *sector_offset)
314 {
315 unsigned int sect_in_chunk;
316 sector_t chunk;
317 struct r0conf *conf = mddev->private;
318 int raid_disks = conf->strip_zone[0].nb_dev;
319 unsigned int chunk_sects = mddev->chunk_sectors;
320
321 if (is_power_of_2(chunk_sects)) {
322 int chunksect_bits = ffz(~chunk_sects);
323 /* find the sector offset inside the chunk */
324 sect_in_chunk = sector & (chunk_sects - 1);
325 sector >>= chunksect_bits;
326 /* chunk in zone */
327 chunk = *sector_offset;
328 /* quotient is the chunk in real device*/
329 sector_div(chunk, zone->nb_dev << chunksect_bits);
330 } else{
331 sect_in_chunk = sector_div(sector, chunk_sects);
332 chunk = *sector_offset;
333 sector_div(chunk, chunk_sects * zone->nb_dev);
334 }
335 /*
336 * position the bio over the real device
337 * real sector = chunk in device + starting of zone
338 * + the position in the chunk
339 */
340 *sector_offset = (chunk * chunk_sects) + sect_in_chunk;
341 return conf->devlist[(zone - conf->strip_zone)*raid_disks
342 + sector_div(sector, zone->nb_dev)];
343 }
344
345 static sector_t raid0_size(struct mddev *mddev, sector_t sectors, int raid_disks)
346 {
347 sector_t array_sectors = 0;
348 struct md_rdev *rdev;
349
350 WARN_ONCE(sectors || raid_disks,
351 "%s does not support generic reshape\n", __func__);
352
353 rdev_for_each(rdev, mddev)
354 array_sectors += (rdev->sectors &
355 ~(sector_t)(mddev->chunk_sectors-1));
356
357 return array_sectors;
358 }
359
360 static void free_conf(struct mddev *mddev, struct r0conf *conf)
361 {
362 kfree(conf->strip_zone);
363 kfree(conf->devlist);
364 kfree(conf);
365 mddev->private = NULL;
366 }
367
368 static void raid0_free(struct mddev *mddev, void *priv)
369 {
370 struct r0conf *conf = priv;
371
372 free_conf(mddev, conf);
373 acct_bioset_exit(mddev);
374 }
375
376 static int raid0_run(struct mddev *mddev)
377 {
378 struct r0conf *conf;
379 int ret;
380
381 if (mddev->chunk_sectors == 0) {
382 pr_warn("md/raid0:%s: chunk size must be set.\n", mdname(mddev));
383 return -EINVAL;
384 }
385 if (md_check_no_bitmap(mddev))
386 return -EINVAL;
387
388 if (acct_bioset_init(mddev)) {
389 pr_err("md/raid0:%s: alloc acct bioset failed.\n", mdname(mddev));
390 return -ENOMEM;
391 }
392
393 /* if private is not null, we are here after takeover */
394 if (mddev->private == NULL) {
395 ret = create_strip_zones(mddev, &conf);
396 if (ret < 0)
397 goto exit_acct_set;
398 mddev->private = conf;
399 }
400 conf = mddev->private;
401 if (mddev->queue) {
402 struct md_rdev *rdev;
403 bool discard_supported = false;
404
405 blk_queue_max_hw_sectors(mddev->queue, mddev->chunk_sectors);
406 blk_queue_max_write_same_sectors(mddev->queue, mddev->chunk_sectors);
407 blk_queue_max_write_zeroes_sectors(mddev->queue, mddev->chunk_sectors);
408 blk_queue_max_discard_sectors(mddev->queue, UINT_MAX);
409
410 blk_queue_io_min(mddev->queue, mddev->chunk_sectors << 9);
411 blk_queue_io_opt(mddev->queue,
412 (mddev->chunk_sectors << 9) * mddev->raid_disks);
413
414 rdev_for_each(rdev, mddev) {
415 disk_stack_limits(mddev->gendisk, rdev->bdev,
416 rdev->data_offset << 9);
417 if (blk_queue_discard(bdev_get_queue(rdev->bdev)))
418 discard_supported = true;
419 }
420 if (!discard_supported)
421 blk_queue_flag_clear(QUEUE_FLAG_DISCARD, mddev->queue);
422 else
423 blk_queue_flag_set(QUEUE_FLAG_DISCARD, mddev->queue);
424 }
425
426 /* calculate array device size */
427 md_set_array_sectors(mddev, raid0_size(mddev, 0, 0));
428
429 pr_debug("md/raid0:%s: md_size is %llu sectors.\n",
430 mdname(mddev),
431 (unsigned long long)mddev->array_sectors);
432
433 dump_zones(mddev);
434
435 ret = md_integrity_register(mddev);
436 if (ret)
437 goto free;
438
439 return ret;
440
441 free:
442 free_conf(mddev, conf);
443 exit_acct_set:
444 acct_bioset_exit(mddev);
445 return ret;
446 }
447
448 static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
449 {
450 struct r0conf *conf = mddev->private;
451 struct strip_zone *zone;
452 sector_t start = bio->bi_iter.bi_sector;
453 sector_t end;
454 unsigned int stripe_size;
455 sector_t first_stripe_index, last_stripe_index;
456 sector_t start_disk_offset;
457 unsigned int start_disk_index;
458 sector_t end_disk_offset;
459 unsigned int end_disk_index;
460 unsigned int disk;
461
462 zone = find_zone(conf, &start);
463
464 if (bio_end_sector(bio) > zone->zone_end) {
465 struct bio *split = bio_split(bio,
466 zone->zone_end - bio->bi_iter.bi_sector, GFP_NOIO,
467 &mddev->bio_set);
468 bio_chain(split, bio);
469 submit_bio_noacct(bio);
470 bio = split;
471 end = zone->zone_end;
472 } else
473 end = bio_end_sector(bio);
474
475 if (zone != conf->strip_zone)
476 end = end - zone[-1].zone_end;
477
478 /* Now start and end is the offset in zone */
479 stripe_size = zone->nb_dev * mddev->chunk_sectors;
480
481 first_stripe_index = start;
482 sector_div(first_stripe_index, stripe_size);
483 last_stripe_index = end;
484 sector_div(last_stripe_index, stripe_size);
485
486 start_disk_index = (int)(start - first_stripe_index * stripe_size) /
487 mddev->chunk_sectors;
488 start_disk_offset = ((int)(start - first_stripe_index * stripe_size) %
489 mddev->chunk_sectors) +
490 first_stripe_index * mddev->chunk_sectors;
491 end_disk_index = (int)(end - last_stripe_index * stripe_size) /
492 mddev->chunk_sectors;
493 end_disk_offset = ((int)(end - last_stripe_index * stripe_size) %
494 mddev->chunk_sectors) +
495 last_stripe_index * mddev->chunk_sectors;
496
497 for (disk = 0; disk < zone->nb_dev; disk++) {
498 sector_t dev_start, dev_end;
499 struct md_rdev *rdev;
500
501 if (disk < start_disk_index)
502 dev_start = (first_stripe_index + 1) *
503 mddev->chunk_sectors;
504 else if (disk > start_disk_index)
505 dev_start = first_stripe_index * mddev->chunk_sectors;
506 else
507 dev_start = start_disk_offset;
508
509 if (disk < end_disk_index)
510 dev_end = (last_stripe_index + 1) * mddev->chunk_sectors;
511 else if (disk > end_disk_index)
512 dev_end = last_stripe_index * mddev->chunk_sectors;
513 else
514 dev_end = end_disk_offset;
515
516 if (dev_end <= dev_start)
517 continue;
518
519 rdev = conf->devlist[(zone - conf->strip_zone) *
520 conf->strip_zone[0].nb_dev + disk];
521 md_submit_discard_bio(mddev, rdev, bio,
522 dev_start + zone->dev_start + rdev->data_offset,
523 dev_end - dev_start);
524 }
525 bio_endio(bio);
526 }
527
528 static bool raid0_make_request(struct mddev *mddev, struct bio *bio)
529 {
530 struct r0conf *conf = mddev->private;
531 struct strip_zone *zone;
532 struct md_rdev *tmp_dev;
533 sector_t bio_sector;
534 sector_t sector;
535 sector_t orig_sector;
536 unsigned chunk_sects;
537 unsigned sectors;
538
539 if (unlikely(bio->bi_opf & REQ_PREFLUSH)
540 && md_flush_request(mddev, bio))
541 return true;
542
543 if (unlikely((bio_op(bio) == REQ_OP_DISCARD))) {
544 raid0_handle_discard(mddev, bio);
545 return true;
546 }
547
548 bio_sector = bio->bi_iter.bi_sector;
549 sector = bio_sector;
550 chunk_sects = mddev->chunk_sectors;
551
552 sectors = chunk_sects -
553 (likely(is_power_of_2(chunk_sects))
554 ? (sector & (chunk_sects-1))
555 : sector_div(sector, chunk_sects));
556
557 /* Restore due to sector_div */
558 sector = bio_sector;
559
560 if (sectors < bio_sectors(bio)) {
561 struct bio *split = bio_split(bio, sectors, GFP_NOIO,
562 &mddev->bio_set);
563 bio_chain(split, bio);
564 submit_bio_noacct(bio);
565 bio = split;
566 }
567
568 if (bio->bi_pool != &mddev->bio_set)
569 md_account_bio(mddev, &bio);
570
571 orig_sector = sector;
572 zone = find_zone(mddev->private, &sector);
573 switch (conf->layout) {
574 case RAID0_ORIG_LAYOUT:
575 tmp_dev = map_sector(mddev, zone, orig_sector, &sector);
576 break;
577 case RAID0_ALT_MULTIZONE_LAYOUT:
578 tmp_dev = map_sector(mddev, zone, sector, &sector);
579 break;
580 default:
581 WARN(1, "md/raid0:%s: Invalid layout\n", mdname(mddev));
582 bio_io_error(bio);
583 return true;
584 }
585
586 if (unlikely(is_mddev_broken(tmp_dev, "raid0"))) {
587 bio_io_error(bio);
588 return true;
589 }
590
591 bio_set_dev(bio, tmp_dev->bdev);
592 bio->bi_iter.bi_sector = sector + zone->dev_start +
593 tmp_dev->data_offset;
594
595 if (mddev->gendisk)
596 trace_block_bio_remap(bio, disk_devt(mddev->gendisk),
597 bio_sector);
598 mddev_check_writesame(mddev, bio);
599 mddev_check_write_zeroes(mddev, bio);
600 submit_bio_noacct(bio);
601 return true;
602 }
603
604 static void raid0_status(struct seq_file *seq, struct mddev *mddev)
605 {
606 seq_printf(seq, " %dk chunks", mddev->chunk_sectors / 2);
607 return;
608 }
609
610 static void *raid0_takeover_raid45(struct mddev *mddev)
611 {
612 struct md_rdev *rdev;
613 struct r0conf *priv_conf;
614
615 if (mddev->degraded != 1) {
616 pr_warn("md/raid0:%s: raid5 must be degraded! Degraded disks: %d\n",
617 mdname(mddev),
618 mddev->degraded);
619 return ERR_PTR(-EINVAL);
620 }
621
622 rdev_for_each(rdev, mddev) {
623 /* check slot number for a disk */
624 if (rdev->raid_disk == mddev->raid_disks-1) {
625 pr_warn("md/raid0:%s: raid5 must have missing parity disk!\n",
626 mdname(mddev));
627 return ERR_PTR(-EINVAL);
628 }
629 rdev->sectors = mddev->dev_sectors;
630 }
631
632 /* Set new parameters */
633 mddev->new_level = 0;
634 mddev->new_layout = 0;
635 mddev->new_chunk_sectors = mddev->chunk_sectors;
636 mddev->raid_disks--;
637 mddev->delta_disks = -1;
638 /* make sure it will be not marked as dirty */
639 mddev->recovery_cp = MaxSector;
640 mddev_clear_unsupported_flags(mddev, UNSUPPORTED_MDDEV_FLAGS);
641
642 create_strip_zones(mddev, &priv_conf);
643
644 return priv_conf;
645 }
646
647 static void *raid0_takeover_raid10(struct mddev *mddev)
648 {
649 struct r0conf *priv_conf;
650
651 /* Check layout:
652 * - far_copies must be 1
653 * - near_copies must be 2
654 * - disks number must be even
655 * - all mirrors must be already degraded
656 */
657 if (mddev->layout != ((1 << 8) + 2)) {
658 pr_warn("md/raid0:%s:: Raid0 cannot takeover layout: 0x%x\n",
659 mdname(mddev),
660 mddev->layout);
661 return ERR_PTR(-EINVAL);
662 }
663 if (mddev->raid_disks & 1) {
664 pr_warn("md/raid0:%s: Raid0 cannot takeover Raid10 with odd disk number.\n",
665 mdname(mddev));
666 return ERR_PTR(-EINVAL);
667 }
668 if (mddev->degraded != (mddev->raid_disks>>1)) {
669 pr_warn("md/raid0:%s: All mirrors must be already degraded!\n",
670 mdname(mddev));
671 return ERR_PTR(-EINVAL);
672 }
673
674 /* Set new parameters */
675 mddev->new_level = 0;
676 mddev->new_layout = 0;
677 mddev->new_chunk_sectors = mddev->chunk_sectors;
678 mddev->delta_disks = - mddev->raid_disks / 2;
679 mddev->raid_disks += mddev->delta_disks;
680 mddev->degraded = 0;
681 /* make sure it will be not marked as dirty */
682 mddev->recovery_cp = MaxSector;
683 mddev_clear_unsupported_flags(mddev, UNSUPPORTED_MDDEV_FLAGS);
684
685 create_strip_zones(mddev, &priv_conf);
686 return priv_conf;
687 }
688
689 static void *raid0_takeover_raid1(struct mddev *mddev)
690 {
691 struct r0conf *priv_conf;
692 int chunksect;
693
694 /* Check layout:
695 * - (N - 1) mirror drives must be already faulty
696 */
697 if ((mddev->raid_disks - 1) != mddev->degraded) {
698 pr_err("md/raid0:%s: (N - 1) mirrors drives must be already faulty!\n",
699 mdname(mddev));
700 return ERR_PTR(-EINVAL);
701 }
702
703 /*
704 * a raid1 doesn't have the notion of chunk size, so
705 * figure out the largest suitable size we can use.
706 */
707 chunksect = 64 * 2; /* 64K by default */
708
709 /* The array must be an exact multiple of chunksize */
710 while (chunksect && (mddev->array_sectors & (chunksect - 1)))
711 chunksect >>= 1;
712
713 if ((chunksect << 9) < PAGE_SIZE)
714 /* array size does not allow a suitable chunk size */
715 return ERR_PTR(-EINVAL);
716
717 /* Set new parameters */
718 mddev->new_level = 0;
719 mddev->new_layout = 0;
720 mddev->new_chunk_sectors = chunksect;
721 mddev->chunk_sectors = chunksect;
722 mddev->delta_disks = 1 - mddev->raid_disks;
723 mddev->raid_disks = 1;
724 /* make sure it will be not marked as dirty */
725 mddev->recovery_cp = MaxSector;
726 mddev_clear_unsupported_flags(mddev, UNSUPPORTED_MDDEV_FLAGS);
727
728 create_strip_zones(mddev, &priv_conf);
729 return priv_conf;
730 }
731
732 static void *raid0_takeover(struct mddev *mddev)
733 {
734 /* raid0 can take over:
735 * raid4 - if all data disks are active.
736 * raid5 - providing it is Raid4 layout and one disk is faulty
737 * raid10 - assuming we have all necessary active disks
738 * raid1 - with (N -1) mirror drives faulty
739 */
740
741 if (mddev->bitmap) {
742 pr_warn("md/raid0: %s: cannot takeover array with bitmap\n",
743 mdname(mddev));
744 return ERR_PTR(-EBUSY);
745 }
746 if (mddev->level == 4)
747 return raid0_takeover_raid45(mddev);
748
749 if (mddev->level == 5) {
750 if (mddev->layout == ALGORITHM_PARITY_N)
751 return raid0_takeover_raid45(mddev);
752
753 pr_warn("md/raid0:%s: Raid can only takeover Raid5 with layout: %d\n",
754 mdname(mddev), ALGORITHM_PARITY_N);
755 }
756
757 if (mddev->level == 10)
758 return raid0_takeover_raid10(mddev);
759
760 if (mddev->level == 1)
761 return raid0_takeover_raid1(mddev);
762
763 pr_warn("Takeover from raid%i to raid0 not supported\n",
764 mddev->level);
765
766 return ERR_PTR(-EINVAL);
767 }
768
769 static void raid0_quiesce(struct mddev *mddev, int quiesce)
770 {
771 }
772
773 static struct md_personality raid0_personality=
774 {
775 .name = "raid0",
776 .level = 0,
777 .owner = THIS_MODULE,
778 .make_request = raid0_make_request,
779 .run = raid0_run,
780 .free = raid0_free,
781 .status = raid0_status,
782 .size = raid0_size,
783 .takeover = raid0_takeover,
784 .quiesce = raid0_quiesce,
785 };
786
787 static int __init raid0_init (void)
788 {
789 return register_md_personality (&raid0_personality);
790 }
791
792 static void raid0_exit (void)
793 {
794 unregister_md_personality (&raid0_personality);
795 }
796
797 module_init(raid0_init);
798 module_exit(raid0_exit);
799 MODULE_LICENSE("GPL");
800 MODULE_DESCRIPTION("RAID0 (striping) personality for MD");
801 MODULE_ALIAS("md-personality-2"); /* RAID0 */
802 MODULE_ALIAS("md-raid0");
803 MODULE_ALIAS("md-level-0");