Lines Matching refs:mddev
37 static void dump_zones(struct mddev *mddev) in dump_zones() argument
42 struct r0conf *conf = mddev->private; in dump_zones()
45 mdname(mddev), in dump_zones()
65 static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf) in create_strip_zones() argument
75 if (!mddev_is_dm(mddev)) in create_strip_zones()
76 blksize = queue_logical_block_size(mddev->gendisk->queue); in create_strip_zones()
81 rdev_for_each(rdev1, mddev) { in create_strip_zones()
83 mdname(mddev), in create_strip_zones()
89 sector_div(sectors, mddev->chunk_sectors); in create_strip_zones()
90 rdev1->sectors = sectors * mddev->chunk_sectors; in create_strip_zones()
92 if (mddev_is_dm(mddev)) in create_strip_zones()
96 rdev_for_each(rdev2, mddev) { in create_strip_zones()
99 mdname(mddev), in create_strip_zones()
106 mdname(mddev)); in create_strip_zones()
115 mdname(mddev)); in create_strip_zones()
120 mdname(mddev)); in create_strip_zones()
124 mdname(mddev)); in create_strip_zones()
127 mdname(mddev), conf->nr_strip_zones); in create_strip_zones()
131 mdname(mddev), conf->nr_strip_zones); in create_strip_zones()
137 if ((mddev->chunk_sectors << 9) % blksize) { in create_strip_zones()
139 mdname(mddev), in create_strip_zones()
140 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()
281 sector_div(first_sector, mddev->chunk_sectors); in create_strip_zones()
289 pr_debug("md/raid0:%s: done.\n", mdname(mddev)); in create_strip_zones()
324 static struct md_rdev *map_sector(struct mddev *mddev, struct strip_zone *zone, in map_sector() argument
329 struct r0conf *conf = mddev->private; in map_sector()
331 unsigned int chunk_sects = mddev->chunk_sectors; in map_sector()
357 static sector_t raid0_size(struct mddev *mddev, sector_t sectors, int raid_disks) in raid0_size() argument
365 rdev_for_each(rdev, mddev) in raid0_size()
367 ~(sector_t)(mddev->chunk_sectors-1)); in raid0_size()
372 static void raid0_free(struct mddev *mddev, void *priv) in raid0_free() argument
381 static int raid0_set_limits(struct mddev *mddev) in raid0_set_limits() argument
387 lim.max_hw_sectors = mddev->chunk_sectors; in raid0_set_limits()
388 lim.max_write_zeroes_sectors = mddev->chunk_sectors; in raid0_set_limits()
389 lim.max_hw_wzeroes_unmap_sectors = mddev->chunk_sectors; in raid0_set_limits()
390 lim.logical_block_size = mddev->logical_block_size; in raid0_set_limits()
391 lim.io_min = mddev->chunk_sectors << 9; in raid0_set_limits()
392 lim.io_opt = lim.io_min * mddev->raid_disks; in raid0_set_limits()
393 lim.chunk_sectors = mddev->chunk_sectors; in raid0_set_limits()
395 err = mddev_stack_rdev_limits(mddev, &lim, MDDEV_STACK_INTEGRITY); in raid0_set_limits()
398 return queue_limits_set(mddev->gendisk->queue, &lim); in raid0_set_limits()
401 static int raid0_run(struct mddev *mddev) in raid0_run() argument
406 if (mddev->chunk_sectors == 0) { in raid0_run()
407 pr_warn("md/raid0:%s: chunk size must be set.\n", mdname(mddev)); in raid0_run()
410 if (md_check_no_bitmap(mddev)) in raid0_run()
413 if (!mddev_is_dm(mddev)) { in raid0_run()
414 ret = raid0_set_limits(mddev); in raid0_run()
420 if (mddev->private == NULL) { in raid0_run()
421 ret = create_strip_zones(mddev, &conf); in raid0_run()
424 mddev->private = conf; in raid0_run()
426 conf = mddev->private; in raid0_run()
429 md_set_array_sectors(mddev, raid0_size(mddev, 0, 0)); in raid0_run()
432 mdname(mddev), in raid0_run()
433 (unsigned long long)mddev->array_sectors); in raid0_run()
435 dump_zones(mddev); in raid0_run()
437 return md_integrity_register(mddev); in raid0_run()
454 static void raid0_handle_discard(struct mddev *mddev, struct bio *bio) in raid0_handle_discard() argument
456 struct r0conf *conf = mddev->private; in raid0_handle_discard()
475 &mddev->bio_set); in raid0_handle_discard()
489 stripe_size = zone->nb_dev * mddev->chunk_sectors; in raid0_handle_discard()
498 sector_div(orig_start, mddev->chunk_sectors); in raid0_handle_discard()
503 sector_div(orig_end, mddev->chunk_sectors); in raid0_handle_discard()
509 mddev->chunk_sectors; in raid0_handle_discard()
511 mddev->chunk_sectors; in raid0_handle_discard()
514 mddev->chunk_sectors) + in raid0_handle_discard()
515 first_stripe_index * mddev->chunk_sectors; in raid0_handle_discard()
517 mddev->chunk_sectors) + in raid0_handle_discard()
518 last_stripe_index * mddev->chunk_sectors; in raid0_handle_discard()
530 mddev->chunk_sectors; in raid0_handle_discard()
532 dev_start = first_stripe_index * mddev->chunk_sectors; in raid0_handle_discard()
537 dev_end = (last_stripe_index + 1) * mddev->chunk_sectors; in raid0_handle_discard()
539 dev_end = last_stripe_index * mddev->chunk_sectors; in raid0_handle_discard()
548 md_submit_discard_bio(mddev, rdev, bio, in raid0_handle_discard()
555 static void raid0_map_submit_bio(struct mddev *mddev, struct bio *bio) in raid0_map_submit_bio() argument
557 struct r0conf *conf = mddev->private; in raid0_map_submit_bio()
563 md_account_bio(mddev, &bio); in raid0_map_submit_bio()
565 zone = find_zone(mddev->private, §or); in raid0_map_submit_bio()
568 tmp_dev = map_sector(mddev, zone, bio_sector, §or); in raid0_map_submit_bio()
571 tmp_dev = map_sector(mddev, zone, sector, §or); in raid0_map_submit_bio()
574 WARN(1, "md/raid0:%s: Invalid layout\n", mdname(mddev)); in raid0_map_submit_bio()
581 md_error(mddev, tmp_dev); in raid0_map_submit_bio()
588 mddev_trace_remap(mddev, bio, bio_sector); in raid0_map_submit_bio()
589 mddev_check_write_zeroes(mddev, bio); in raid0_map_submit_bio()
593 static bool raid0_make_request(struct mddev *mddev, struct bio *bio) in raid0_make_request() argument
600 && md_flush_request(mddev, bio)) in raid0_make_request()
604 raid0_handle_discard(mddev, bio); in raid0_make_request()
609 chunk_sects = mddev->chunk_sectors; in raid0_make_request()
618 &mddev->bio_set); in raid0_make_request()
623 raid0_map_submit_bio(mddev, bio); in raid0_make_request()
627 static void raid0_status(struct seq_file *seq, struct mddev *mddev) in raid0_status() argument
629 seq_printf(seq, " %dk chunks", mddev->chunk_sectors / 2); in raid0_status()
633 static void raid0_error(struct mddev *mddev, struct md_rdev *rdev) in raid0_error() argument
635 if (!test_and_set_bit(MD_BROKEN, &mddev->flags)) { in raid0_error()
636 char *md_name = mdname(mddev); in raid0_error()
643 static void *raid0_takeover_raid45(struct mddev *mddev) in raid0_takeover_raid45() argument
648 if (mddev->degraded != 1) { in raid0_takeover_raid45()
650 mdname(mddev), in raid0_takeover_raid45()
651 mddev->degraded); in raid0_takeover_raid45()
655 rdev_for_each(rdev, mddev) { in raid0_takeover_raid45()
657 if (rdev->raid_disk == mddev->raid_disks-1) { in raid0_takeover_raid45()
659 mdname(mddev)); in raid0_takeover_raid45()
662 rdev->sectors = mddev->dev_sectors; in raid0_takeover_raid45()
666 mddev->new_level = 0; in raid0_takeover_raid45()
667 mddev->new_layout = 0; in raid0_takeover_raid45()
668 mddev->new_chunk_sectors = mddev->chunk_sectors; in raid0_takeover_raid45()
669 mddev->raid_disks--; in raid0_takeover_raid45()
670 mddev->delta_disks = -1; in raid0_takeover_raid45()
672 mddev->resync_offset = MaxSector; in raid0_takeover_raid45()
673 mddev_clear_unsupported_flags(mddev, UNSUPPORTED_MDDEV_FLAGS); in raid0_takeover_raid45()
675 create_strip_zones(mddev, &priv_conf); in raid0_takeover_raid45()
680 static void *raid0_takeover_raid10(struct mddev *mddev) in raid0_takeover_raid10() argument
690 if (mddev->layout != ((1 << 8) + 2)) { in raid0_takeover_raid10()
692 mdname(mddev), in raid0_takeover_raid10()
693 mddev->layout); in raid0_takeover_raid10()
696 if (mddev->raid_disks & 1) { in raid0_takeover_raid10()
698 mdname(mddev)); in raid0_takeover_raid10()
701 if (mddev->degraded != (mddev->raid_disks>>1)) { in raid0_takeover_raid10()
703 mdname(mddev)); in raid0_takeover_raid10()
708 mddev->new_level = 0; in raid0_takeover_raid10()
709 mddev->new_layout = 0; in raid0_takeover_raid10()
710 mddev->new_chunk_sectors = mddev->chunk_sectors; in raid0_takeover_raid10()
711 mddev->delta_disks = - mddev->raid_disks / 2; in raid0_takeover_raid10()
712 mddev->raid_disks += mddev->delta_disks; in raid0_takeover_raid10()
713 mddev->degraded = 0; in raid0_takeover_raid10()
715 mddev->resync_offset = MaxSector; in raid0_takeover_raid10()
716 mddev_clear_unsupported_flags(mddev, UNSUPPORTED_MDDEV_FLAGS); in raid0_takeover_raid10()
718 create_strip_zones(mddev, &priv_conf); in raid0_takeover_raid10()
722 static void *raid0_takeover_raid1(struct mddev *mddev) in raid0_takeover_raid1() argument
730 if ((mddev->raid_disks - 1) != mddev->degraded) { in raid0_takeover_raid1()
732 mdname(mddev)); in raid0_takeover_raid1()
743 while (chunksect && (mddev->array_sectors & (chunksect - 1))) in raid0_takeover_raid1()
751 mddev->new_level = 0; in raid0_takeover_raid1()
752 mddev->new_layout = 0; in raid0_takeover_raid1()
753 mddev->new_chunk_sectors = chunksect; in raid0_takeover_raid1()
754 mddev->chunk_sectors = chunksect; in raid0_takeover_raid1()
755 mddev->delta_disks = 1 - mddev->raid_disks; in raid0_takeover_raid1()
756 mddev->raid_disks = 1; in raid0_takeover_raid1()
758 mddev->resync_offset = MaxSector; in raid0_takeover_raid1()
759 mddev_clear_unsupported_flags(mddev, UNSUPPORTED_MDDEV_FLAGS); in raid0_takeover_raid1()
761 create_strip_zones(mddev, &priv_conf); in raid0_takeover_raid1()
765 static void *raid0_takeover(struct mddev *mddev) in raid0_takeover() argument
774 if (mddev->bitmap) { in raid0_takeover()
776 mdname(mddev)); in raid0_takeover()
779 if (mddev->level == 4) in raid0_takeover()
780 return raid0_takeover_raid45(mddev); in raid0_takeover()
782 if (mddev->level == 5) { in raid0_takeover()
783 if (mddev->layout == ALGORITHM_PARITY_N) in raid0_takeover()
784 return raid0_takeover_raid45(mddev); in raid0_takeover()
787 mdname(mddev), ALGORITHM_PARITY_N); in raid0_takeover()
790 if (mddev->level == 10) in raid0_takeover()
791 return raid0_takeover_raid10(mddev); in raid0_takeover()
793 if (mddev->level == 1) in raid0_takeover()
794 return raid0_takeover_raid1(mddev); in raid0_takeover()
797 mddev->level); in raid0_takeover()
802 static void raid0_quiesce(struct mddev *mddev, int quiesce) in raid0_quiesce() argument