Lines Matching refs:mddev
36 static int raid0_congested(struct mddev *mddev, int bits) in raid0_congested() argument
38 struct r0conf *conf = mddev->private; in raid0_congested()
54 static void dump_zones(struct mddev *mddev) in dump_zones() argument
60 struct r0conf *conf = mddev->private; in dump_zones()
63 mdname(mddev), in dump_zones()
84 static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf) in create_strip_zones() argument
99 rdev_for_each(rdev1, mddev) { in create_strip_zones()
101 mdname(mddev), in create_strip_zones()
107 sector_div(sectors, mddev->chunk_sectors); in create_strip_zones()
108 rdev1->sectors = sectors * mddev->chunk_sectors; in create_strip_zones()
113 rdev_for_each(rdev2, mddev) { in create_strip_zones()
116 mdname(mddev), in create_strip_zones()
123 mdname(mddev)); in create_strip_zones()
132 mdname(mddev)); in create_strip_zones()
137 mdname(mddev)); in create_strip_zones()
141 mdname(mddev)); in create_strip_zones()
144 mdname(mddev), conf->nr_strip_zones); in create_strip_zones()
148 mdname(mddev), conf->nr_strip_zones); in create_strip_zones()
153 if ((mddev->chunk_sectors << 9) % blksize) { in create_strip_zones()
155 mdname(mddev), in create_strip_zones()
156 mddev->chunk_sectors << 9, blksize); in create_strip_zones()
169 mddev->raid_disks), in create_strip_zones()
182 rdev_for_each(rdev1, mddev) { in create_strip_zones()
185 if (mddev->level == 10) { in create_strip_zones()
191 if (mddev->level == 1) { in create_strip_zones()
201 mdname(mddev)); in create_strip_zones()
204 if (j >= mddev->raid_disks) { in create_strip_zones()
206 mdname(mddev), j); in create_strip_zones()
211 mdname(mddev), j); in create_strip_zones()
220 if (cnt != mddev->raid_disks) { in create_strip_zones()
222 mdname(mddev), cnt, mddev->raid_disks); in create_strip_zones()
236 dev = conf->devlist + i * mddev->raid_disks; in create_strip_zones()
238 pr_debug("md/raid0:%s: zone %d\n", mdname(mddev), i); in create_strip_zones()
247 mdname(mddev), in create_strip_zones()
253 mdname(mddev), in create_strip_zones()
260 mdname(mddev), in create_strip_zones()
268 mdname(mddev), in create_strip_zones()
275 mdname(mddev), in create_strip_zones()
279 pr_debug("md/raid0:%s: done.\n", mdname(mddev)); in create_strip_zones()
314 static struct md_rdev *map_sector(struct mddev *mddev, struct strip_zone *zone, in map_sector() argument
319 struct r0conf *conf = mddev->private; in map_sector()
321 unsigned int chunk_sects = mddev->chunk_sectors; in map_sector()
347 static sector_t raid0_size(struct mddev *mddev, sector_t sectors, int raid_disks) in raid0_size() argument
355 rdev_for_each(rdev, mddev) in raid0_size()
357 ~(sector_t)(mddev->chunk_sectors-1)); in raid0_size()
362 static void raid0_free(struct mddev *mddev, void *priv);
364 static int raid0_run(struct mddev *mddev) in raid0_run() argument
369 if (mddev->chunk_sectors == 0) { in raid0_run()
370 pr_warn("md/raid0:%s: chunk size must be set.\n", mdname(mddev)); in raid0_run()
373 if (md_check_no_bitmap(mddev)) in raid0_run()
377 if (mddev->private == NULL) { in raid0_run()
378 ret = create_strip_zones(mddev, &conf); in raid0_run()
381 mddev->private = conf; in raid0_run()
383 conf = mddev->private; in raid0_run()
384 if (mddev->queue) { in raid0_run()
388 blk_queue_max_hw_sectors(mddev->queue, mddev->chunk_sectors); in raid0_run()
389 blk_queue_max_write_same_sectors(mddev->queue, mddev->chunk_sectors); in raid0_run()
390 blk_queue_max_write_zeroes_sectors(mddev->queue, mddev->chunk_sectors); in raid0_run()
391 blk_queue_max_discard_sectors(mddev->queue, UINT_MAX); in raid0_run()
393 blk_queue_io_min(mddev->queue, mddev->chunk_sectors << 9); in raid0_run()
394 blk_queue_io_opt(mddev->queue, in raid0_run()
395 (mddev->chunk_sectors << 9) * mddev->raid_disks); in raid0_run()
397 rdev_for_each(rdev, mddev) { in raid0_run()
398 disk_stack_limits(mddev->gendisk, rdev->bdev, in raid0_run()
404 blk_queue_flag_clear(QUEUE_FLAG_DISCARD, mddev->queue); in raid0_run()
406 blk_queue_flag_set(QUEUE_FLAG_DISCARD, mddev->queue); in raid0_run()
410 md_set_array_sectors(mddev, raid0_size(mddev, 0, 0)); in raid0_run()
413 mdname(mddev), in raid0_run()
414 (unsigned long long)mddev->array_sectors); in raid0_run()
416 if (mddev->queue) { in raid0_run()
426 int stripe = mddev->raid_disks * in raid0_run()
427 (mddev->chunk_sectors << 9) / PAGE_SIZE; in raid0_run()
428 if (mddev->queue->backing_dev_info->ra_pages < 2* stripe) in raid0_run()
429 mddev->queue->backing_dev_info->ra_pages = 2* stripe; in raid0_run()
432 dump_zones(mddev); in raid0_run()
434 ret = md_integrity_register(mddev); in raid0_run()
439 static void raid0_free(struct mddev *mddev, void *priv) in raid0_free() argument
451 static inline int is_io_in_chunk_boundary(struct mddev *mddev, in is_io_in_chunk_boundary() argument
465 static void raid0_handle_discard(struct mddev *mddev, struct bio *bio) in raid0_handle_discard() argument
467 struct r0conf *conf = mddev->private; in raid0_handle_discard()
484 &mddev->bio_set); in raid0_handle_discard()
496 stripe_size = zone->nb_dev * mddev->chunk_sectors; in raid0_handle_discard()
504 mddev->chunk_sectors; in raid0_handle_discard()
506 mddev->chunk_sectors) + in raid0_handle_discard()
507 first_stripe_index * mddev->chunk_sectors; in raid0_handle_discard()
509 mddev->chunk_sectors; in raid0_handle_discard()
511 mddev->chunk_sectors) + in raid0_handle_discard()
512 last_stripe_index * mddev->chunk_sectors; in raid0_handle_discard()
521 mddev->chunk_sectors; in raid0_handle_discard()
523 dev_start = first_stripe_index * mddev->chunk_sectors; in raid0_handle_discard()
528 dev_end = (last_stripe_index + 1) * mddev->chunk_sectors; in raid0_handle_discard()
530 dev_end = last_stripe_index * mddev->chunk_sectors; in raid0_handle_discard()
546 if (mddev->gendisk) in raid0_handle_discard()
548 discard_bio, disk_devt(mddev->gendisk), in raid0_handle_discard()
555 static bool raid0_make_request(struct mddev *mddev, struct bio *bio) in raid0_make_request() argument
565 md_flush_request(mddev, bio); in raid0_make_request()
570 raid0_handle_discard(mddev, bio); in raid0_make_request()
576 chunk_sects = mddev->chunk_sectors; in raid0_make_request()
588 &mddev->bio_set); in raid0_make_request()
594 zone = find_zone(mddev->private, §or); in raid0_make_request()
595 tmp_dev = map_sector(mddev, zone, sector, §or); in raid0_make_request()
600 if (mddev->gendisk) in raid0_make_request()
602 disk_devt(mddev->gendisk), bio_sector); in raid0_make_request()
603 mddev_check_writesame(mddev, bio); in raid0_make_request()
604 mddev_check_write_zeroes(mddev, bio); in raid0_make_request()
609 static void raid0_status(struct seq_file *seq, struct mddev *mddev) in raid0_status() argument
611 seq_printf(seq, " %dk chunks", mddev->chunk_sectors / 2); in raid0_status()
615 static void *raid0_takeover_raid45(struct mddev *mddev) in raid0_takeover_raid45() argument
620 if (mddev->degraded != 1) { in raid0_takeover_raid45()
622 mdname(mddev), in raid0_takeover_raid45()
623 mddev->degraded); in raid0_takeover_raid45()
627 rdev_for_each(rdev, mddev) { in raid0_takeover_raid45()
629 if (rdev->raid_disk == mddev->raid_disks-1) { in raid0_takeover_raid45()
631 mdname(mddev)); in raid0_takeover_raid45()
634 rdev->sectors = mddev->dev_sectors; in raid0_takeover_raid45()
638 mddev->new_level = 0; in raid0_takeover_raid45()
639 mddev->new_layout = 0; in raid0_takeover_raid45()
640 mddev->new_chunk_sectors = mddev->chunk_sectors; in raid0_takeover_raid45()
641 mddev->raid_disks--; in raid0_takeover_raid45()
642 mddev->delta_disks = -1; in raid0_takeover_raid45()
644 mddev->recovery_cp = MaxSector; in raid0_takeover_raid45()
645 mddev_clear_unsupported_flags(mddev, UNSUPPORTED_MDDEV_FLAGS); in raid0_takeover_raid45()
647 create_strip_zones(mddev, &priv_conf); in raid0_takeover_raid45()
652 static void *raid0_takeover_raid10(struct mddev *mddev) in raid0_takeover_raid10() argument
662 if (mddev->layout != ((1 << 8) + 2)) { in raid0_takeover_raid10()
664 mdname(mddev), in raid0_takeover_raid10()
665 mddev->layout); in raid0_takeover_raid10()
668 if (mddev->raid_disks & 1) { in raid0_takeover_raid10()
670 mdname(mddev)); in raid0_takeover_raid10()
673 if (mddev->degraded != (mddev->raid_disks>>1)) { in raid0_takeover_raid10()
675 mdname(mddev)); in raid0_takeover_raid10()
680 mddev->new_level = 0; in raid0_takeover_raid10()
681 mddev->new_layout = 0; in raid0_takeover_raid10()
682 mddev->new_chunk_sectors = mddev->chunk_sectors; in raid0_takeover_raid10()
683 mddev->delta_disks = - mddev->raid_disks / 2; in raid0_takeover_raid10()
684 mddev->raid_disks += mddev->delta_disks; in raid0_takeover_raid10()
685 mddev->degraded = 0; in raid0_takeover_raid10()
687 mddev->recovery_cp = MaxSector; in raid0_takeover_raid10()
688 mddev_clear_unsupported_flags(mddev, UNSUPPORTED_MDDEV_FLAGS); in raid0_takeover_raid10()
690 create_strip_zones(mddev, &priv_conf); in raid0_takeover_raid10()
694 static void *raid0_takeover_raid1(struct mddev *mddev) in raid0_takeover_raid1() argument
702 if ((mddev->raid_disks - 1) != mddev->degraded) { in raid0_takeover_raid1()
704 mdname(mddev)); in raid0_takeover_raid1()
715 while (chunksect && (mddev->array_sectors & (chunksect - 1))) in raid0_takeover_raid1()
723 mddev->new_level = 0; in raid0_takeover_raid1()
724 mddev->new_layout = 0; in raid0_takeover_raid1()
725 mddev->new_chunk_sectors = chunksect; in raid0_takeover_raid1()
726 mddev->chunk_sectors = chunksect; in raid0_takeover_raid1()
727 mddev->delta_disks = 1 - mddev->raid_disks; in raid0_takeover_raid1()
728 mddev->raid_disks = 1; in raid0_takeover_raid1()
730 mddev->recovery_cp = MaxSector; in raid0_takeover_raid1()
731 mddev_clear_unsupported_flags(mddev, UNSUPPORTED_MDDEV_FLAGS); in raid0_takeover_raid1()
733 create_strip_zones(mddev, &priv_conf); in raid0_takeover_raid1()
737 static void *raid0_takeover(struct mddev *mddev) in raid0_takeover() argument
746 if (mddev->bitmap) { in raid0_takeover()
748 mdname(mddev)); in raid0_takeover()
751 if (mddev->level == 4) in raid0_takeover()
752 return raid0_takeover_raid45(mddev); in raid0_takeover()
754 if (mddev->level == 5) { in raid0_takeover()
755 if (mddev->layout == ALGORITHM_PARITY_N) in raid0_takeover()
756 return raid0_takeover_raid45(mddev); in raid0_takeover()
759 mdname(mddev), ALGORITHM_PARITY_N); in raid0_takeover()
762 if (mddev->level == 10) in raid0_takeover()
763 return raid0_takeover_raid10(mddev); in raid0_takeover()
765 if (mddev->level == 1) in raid0_takeover()
766 return raid0_takeover_raid1(mddev); in raid0_takeover()
769 mddev->level); in raid0_takeover()
774 static void raid0_quiesce(struct mddev *mddev, int quiesce) in raid0_quiesce() argument