Lines Matching refs:mddev
35 static void dump_zones(struct mddev *mddev) in dump_zones() argument
41 struct r0conf *conf = mddev->private; in dump_zones()
44 mdname(mddev), in dump_zones()
65 static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf) in create_strip_zones() argument
80 rdev_for_each(rdev1, mddev) { in create_strip_zones()
82 mdname(mddev), in create_strip_zones()
88 sector_div(sectors, mddev->chunk_sectors); in create_strip_zones()
89 rdev1->sectors = sectors * mddev->chunk_sectors; in create_strip_zones()
94 rdev_for_each(rdev2, mddev) { in create_strip_zones()
97 mdname(mddev), in create_strip_zones()
104 mdname(mddev)); in create_strip_zones()
113 mdname(mddev)); in create_strip_zones()
118 mdname(mddev)); in create_strip_zones()
122 mdname(mddev)); in create_strip_zones()
125 mdname(mddev), conf->nr_strip_zones); in create_strip_zones()
129 mdname(mddev), conf->nr_strip_zones); in create_strip_zones()
135 if ((mddev->chunk_sectors << 9) % blksize) { in create_strip_zones()
137 mdname(mddev), in create_strip_zones()
138 mddev->chunk_sectors << 9, blksize); in create_strip_zones()
151 mddev->raid_disks), in create_strip_zones()
164 rdev_for_each(rdev1, mddev) { in create_strip_zones()
167 if (mddev->level == 10) { in create_strip_zones()
173 if (mddev->level == 1) { in create_strip_zones()
183 mdname(mddev)); in create_strip_zones()
186 if (j >= mddev->raid_disks) { in create_strip_zones()
188 mdname(mddev), j); in create_strip_zones()
193 mdname(mddev), j); in create_strip_zones()
202 if (cnt != mddev->raid_disks) { in create_strip_zones()
204 mdname(mddev), cnt, mddev->raid_disks); in create_strip_zones()
218 dev = conf->devlist + i * mddev->raid_disks; in create_strip_zones()
220 pr_debug("md/raid0:%s: zone %d\n", mdname(mddev), i); in create_strip_zones()
229 mdname(mddev), in create_strip_zones()
235 mdname(mddev), in create_strip_zones()
242 mdname(mddev), in create_strip_zones()
250 mdname(mddev), in create_strip_zones()
257 mdname(mddev), in create_strip_zones()
263 } else if (mddev->layout == RAID0_ORIG_LAYOUT || in create_strip_zones()
264 mddev->layout == RAID0_ALT_MULTIZONE_LAYOUT) { in create_strip_zones()
265 conf->layout = mddev->layout; in create_strip_zones()
271 mdname(mddev)); in create_strip_zones()
277 pr_debug("md/raid0:%s: done.\n", mdname(mddev)); in create_strip_zones()
312 static struct md_rdev *map_sector(struct mddev *mddev, struct strip_zone *zone, in map_sector() argument
317 struct r0conf *conf = mddev->private; in map_sector()
319 unsigned int chunk_sects = mddev->chunk_sectors; in map_sector()
345 static sector_t raid0_size(struct mddev *mddev, sector_t sectors, int raid_disks) in raid0_size() argument
353 rdev_for_each(rdev, mddev) in raid0_size()
355 ~(sector_t)(mddev->chunk_sectors-1)); in raid0_size()
360 static void raid0_free(struct mddev *mddev, void *priv);
362 static int raid0_run(struct mddev *mddev) in raid0_run() argument
367 if (mddev->chunk_sectors == 0) { in raid0_run()
368 pr_warn("md/raid0:%s: chunk size must be set.\n", mdname(mddev)); in raid0_run()
371 if (md_check_no_bitmap(mddev)) in raid0_run()
375 if (mddev->private == NULL) { in raid0_run()
376 ret = create_strip_zones(mddev, &conf); in raid0_run()
379 mddev->private = conf; in raid0_run()
381 conf = mddev->private; in raid0_run()
382 if (mddev->queue) { in raid0_run()
386 blk_queue_max_hw_sectors(mddev->queue, mddev->chunk_sectors); in raid0_run()
387 blk_queue_max_write_same_sectors(mddev->queue, mddev->chunk_sectors); in raid0_run()
388 blk_queue_max_write_zeroes_sectors(mddev->queue, mddev->chunk_sectors); in raid0_run()
389 blk_queue_max_discard_sectors(mddev->queue, UINT_MAX); in raid0_run()
391 blk_queue_io_min(mddev->queue, mddev->chunk_sectors << 9); in raid0_run()
392 blk_queue_io_opt(mddev->queue, in raid0_run()
393 (mddev->chunk_sectors << 9) * mddev->raid_disks); in raid0_run()
395 rdev_for_each(rdev, mddev) { in raid0_run()
396 disk_stack_limits(mddev->gendisk, rdev->bdev, in raid0_run()
402 blk_queue_flag_clear(QUEUE_FLAG_DISCARD, mddev->queue); in raid0_run()
404 blk_queue_flag_set(QUEUE_FLAG_DISCARD, mddev->queue); in raid0_run()
408 md_set_array_sectors(mddev, raid0_size(mddev, 0, 0)); in raid0_run()
411 mdname(mddev), in raid0_run()
412 (unsigned long long)mddev->array_sectors); in raid0_run()
414 dump_zones(mddev); in raid0_run()
416 ret = md_integrity_register(mddev); in raid0_run()
421 static void raid0_free(struct mddev *mddev, void *priv) in raid0_free() argument
430 static void raid0_handle_discard(struct mddev *mddev, struct bio *bio) in raid0_handle_discard() argument
432 struct r0conf *conf = mddev->private; in raid0_handle_discard()
449 &mddev->bio_set); in raid0_handle_discard()
461 stripe_size = zone->nb_dev * mddev->chunk_sectors; in raid0_handle_discard()
469 mddev->chunk_sectors; in raid0_handle_discard()
471 mddev->chunk_sectors) + in raid0_handle_discard()
472 first_stripe_index * mddev->chunk_sectors; in raid0_handle_discard()
474 mddev->chunk_sectors; in raid0_handle_discard()
476 mddev->chunk_sectors) + in raid0_handle_discard()
477 last_stripe_index * mddev->chunk_sectors; in raid0_handle_discard()
486 mddev->chunk_sectors; in raid0_handle_discard()
488 dev_start = first_stripe_index * mddev->chunk_sectors; in raid0_handle_discard()
493 dev_end = (last_stripe_index + 1) * mddev->chunk_sectors; in raid0_handle_discard()
495 dev_end = last_stripe_index * mddev->chunk_sectors; in raid0_handle_discard()
511 if (mddev->gendisk) in raid0_handle_discard()
513 discard_bio, disk_devt(mddev->gendisk), in raid0_handle_discard()
520 static bool raid0_make_request(struct mddev *mddev, struct bio *bio) in raid0_make_request() argument
522 struct r0conf *conf = mddev->private; in raid0_make_request()
532 && md_flush_request(mddev, bio)) in raid0_make_request()
536 raid0_handle_discard(mddev, bio); in raid0_make_request()
542 chunk_sects = mddev->chunk_sectors; in raid0_make_request()
554 &mddev->bio_set); in raid0_make_request()
561 zone = find_zone(mddev->private, §or); in raid0_make_request()
564 tmp_dev = map_sector(mddev, zone, orig_sector, §or); in raid0_make_request()
567 tmp_dev = map_sector(mddev, zone, sector, §or); in raid0_make_request()
570 WARN(1, "md/raid0:%s: Invalid layout\n", mdname(mddev)); in raid0_make_request()
584 if (mddev->gendisk) in raid0_make_request()
586 disk_devt(mddev->gendisk), bio_sector); in raid0_make_request()
587 mddev_check_writesame(mddev, bio); in raid0_make_request()
588 mddev_check_write_zeroes(mddev, bio); in raid0_make_request()
593 static void raid0_status(struct seq_file *seq, struct mddev *mddev) in raid0_status() argument
595 seq_printf(seq, " %dk chunks", mddev->chunk_sectors / 2); in raid0_status()
599 static void *raid0_takeover_raid45(struct mddev *mddev) in raid0_takeover_raid45() argument
604 if (mddev->degraded != 1) { in raid0_takeover_raid45()
606 mdname(mddev), in raid0_takeover_raid45()
607 mddev->degraded); in raid0_takeover_raid45()
611 rdev_for_each(rdev, mddev) { in raid0_takeover_raid45()
613 if (rdev->raid_disk == mddev->raid_disks-1) { in raid0_takeover_raid45()
615 mdname(mddev)); in raid0_takeover_raid45()
618 rdev->sectors = mddev->dev_sectors; in raid0_takeover_raid45()
622 mddev->new_level = 0; in raid0_takeover_raid45()
623 mddev->new_layout = 0; in raid0_takeover_raid45()
624 mddev->new_chunk_sectors = mddev->chunk_sectors; in raid0_takeover_raid45()
625 mddev->raid_disks--; in raid0_takeover_raid45()
626 mddev->delta_disks = -1; in raid0_takeover_raid45()
628 mddev->recovery_cp = MaxSector; in raid0_takeover_raid45()
629 mddev_clear_unsupported_flags(mddev, UNSUPPORTED_MDDEV_FLAGS); in raid0_takeover_raid45()
631 create_strip_zones(mddev, &priv_conf); in raid0_takeover_raid45()
636 static void *raid0_takeover_raid10(struct mddev *mddev) in raid0_takeover_raid10() argument
646 if (mddev->layout != ((1 << 8) + 2)) { in raid0_takeover_raid10()
648 mdname(mddev), in raid0_takeover_raid10()
649 mddev->layout); in raid0_takeover_raid10()
652 if (mddev->raid_disks & 1) { in raid0_takeover_raid10()
654 mdname(mddev)); in raid0_takeover_raid10()
657 if (mddev->degraded != (mddev->raid_disks>>1)) { in raid0_takeover_raid10()
659 mdname(mddev)); in raid0_takeover_raid10()
664 mddev->new_level = 0; in raid0_takeover_raid10()
665 mddev->new_layout = 0; in raid0_takeover_raid10()
666 mddev->new_chunk_sectors = mddev->chunk_sectors; in raid0_takeover_raid10()
667 mddev->delta_disks = - mddev->raid_disks / 2; in raid0_takeover_raid10()
668 mddev->raid_disks += mddev->delta_disks; in raid0_takeover_raid10()
669 mddev->degraded = 0; in raid0_takeover_raid10()
671 mddev->recovery_cp = MaxSector; in raid0_takeover_raid10()
672 mddev_clear_unsupported_flags(mddev, UNSUPPORTED_MDDEV_FLAGS); in raid0_takeover_raid10()
674 create_strip_zones(mddev, &priv_conf); in raid0_takeover_raid10()
678 static void *raid0_takeover_raid1(struct mddev *mddev) in raid0_takeover_raid1() argument
686 if ((mddev->raid_disks - 1) != mddev->degraded) { in raid0_takeover_raid1()
688 mdname(mddev)); in raid0_takeover_raid1()
699 while (chunksect && (mddev->array_sectors & (chunksect - 1))) in raid0_takeover_raid1()
707 mddev->new_level = 0; in raid0_takeover_raid1()
708 mddev->new_layout = 0; in raid0_takeover_raid1()
709 mddev->new_chunk_sectors = chunksect; in raid0_takeover_raid1()
710 mddev->chunk_sectors = chunksect; in raid0_takeover_raid1()
711 mddev->delta_disks = 1 - mddev->raid_disks; in raid0_takeover_raid1()
712 mddev->raid_disks = 1; in raid0_takeover_raid1()
714 mddev->recovery_cp = MaxSector; in raid0_takeover_raid1()
715 mddev_clear_unsupported_flags(mddev, UNSUPPORTED_MDDEV_FLAGS); in raid0_takeover_raid1()
717 create_strip_zones(mddev, &priv_conf); in raid0_takeover_raid1()
721 static void *raid0_takeover(struct mddev *mddev) in raid0_takeover() argument
730 if (mddev->bitmap) { in raid0_takeover()
732 mdname(mddev)); in raid0_takeover()
735 if (mddev->level == 4) in raid0_takeover()
736 return raid0_takeover_raid45(mddev); in raid0_takeover()
738 if (mddev->level == 5) { in raid0_takeover()
739 if (mddev->layout == ALGORITHM_PARITY_N) in raid0_takeover()
740 return raid0_takeover_raid45(mddev); in raid0_takeover()
743 mdname(mddev), ALGORITHM_PARITY_N); in raid0_takeover()
746 if (mddev->level == 10) in raid0_takeover()
747 return raid0_takeover_raid10(mddev); in raid0_takeover()
749 if (mddev->level == 1) in raid0_takeover()
750 return raid0_takeover_raid1(mddev); in raid0_takeover()
753 mddev->level); in raid0_takeover()
758 static void raid0_quiesce(struct mddev *mddev, int quiesce) in raid0_quiesce() argument