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()
133 } else if (mddev->layout == RAID0_ORIG_LAYOUT || in create_strip_zones()
134 mddev->layout == RAID0_ALT_MULTIZONE_LAYOUT) { in create_strip_zones()
135 conf->layout = mddev->layout; in create_strip_zones()
141 mdname(mddev)); in create_strip_zones()
150 if ((mddev->chunk_sectors << 9) % blksize) { in create_strip_zones()
152 mdname(mddev), in create_strip_zones()
153 mddev->chunk_sectors << 9, blksize); in create_strip_zones()
166 mddev->raid_disks), in create_strip_zones()
179 rdev_for_each(rdev1, mddev) { in create_strip_zones()
182 if (mddev->level == 10) { in create_strip_zones()
188 if (mddev->level == 1) { in create_strip_zones()
198 mdname(mddev)); in create_strip_zones()
201 if (j >= mddev->raid_disks) { in create_strip_zones()
203 mdname(mddev), j); in create_strip_zones()
208 mdname(mddev), j); in create_strip_zones()
217 if (cnt != mddev->raid_disks) { in create_strip_zones()
219 mdname(mddev), cnt, mddev->raid_disks); in create_strip_zones()
233 dev = conf->devlist + i * mddev->raid_disks; in create_strip_zones()
235 pr_debug("md/raid0:%s: zone %d\n", mdname(mddev), i); in create_strip_zones()
244 mdname(mddev), in create_strip_zones()
250 mdname(mddev), in create_strip_zones()
257 mdname(mddev), in create_strip_zones()
265 mdname(mddev), in create_strip_zones()
272 mdname(mddev), in create_strip_zones()
276 pr_debug("md/raid0:%s: done.\n", mdname(mddev)); in create_strip_zones()
311 static struct md_rdev *map_sector(struct mddev *mddev, struct strip_zone *zone, in map_sector() argument
316 struct r0conf *conf = mddev->private; in map_sector()
318 unsigned int chunk_sects = mddev->chunk_sectors; in map_sector()
344 static sector_t raid0_size(struct mddev *mddev, sector_t sectors, int raid_disks) in raid0_size() argument
352 rdev_for_each(rdev, mddev) in raid0_size()
354 ~(sector_t)(mddev->chunk_sectors-1)); in raid0_size()
359 static void raid0_free(struct mddev *mddev, void *priv);
361 static int raid0_run(struct mddev *mddev) in raid0_run() argument
366 if (mddev->chunk_sectors == 0) { in raid0_run()
367 pr_warn("md/raid0:%s: chunk size must be set.\n", mdname(mddev)); in raid0_run()
370 if (md_check_no_bitmap(mddev)) in raid0_run()
374 if (mddev->private == NULL) { in raid0_run()
375 ret = create_strip_zones(mddev, &conf); in raid0_run()
378 mddev->private = conf; in raid0_run()
380 conf = mddev->private; in raid0_run()
381 if (mddev->queue) { in raid0_run()
385 blk_queue_max_hw_sectors(mddev->queue, mddev->chunk_sectors); in raid0_run()
386 blk_queue_max_write_same_sectors(mddev->queue, mddev->chunk_sectors); in raid0_run()
387 blk_queue_max_write_zeroes_sectors(mddev->queue, mddev->chunk_sectors); in raid0_run()
388 blk_queue_max_discard_sectors(mddev->queue, UINT_MAX); in raid0_run()
390 blk_queue_io_min(mddev->queue, mddev->chunk_sectors << 9); in raid0_run()
391 blk_queue_io_opt(mddev->queue, in raid0_run()
392 (mddev->chunk_sectors << 9) * mddev->raid_disks); in raid0_run()
394 rdev_for_each(rdev, mddev) { in raid0_run()
395 disk_stack_limits(mddev->gendisk, rdev->bdev, in raid0_run()
401 blk_queue_flag_clear(QUEUE_FLAG_DISCARD, mddev->queue); in raid0_run()
403 blk_queue_flag_set(QUEUE_FLAG_DISCARD, mddev->queue); in raid0_run()
407 md_set_array_sectors(mddev, raid0_size(mddev, 0, 0)); in raid0_run()
410 mdname(mddev), in raid0_run()
411 (unsigned long long)mddev->array_sectors); in raid0_run()
413 dump_zones(mddev); in raid0_run()
415 ret = md_integrity_register(mddev); in raid0_run()
420 static void raid0_free(struct mddev *mddev, void *priv) in raid0_free() argument
429 static void raid0_handle_discard(struct mddev *mddev, struct bio *bio) in raid0_handle_discard() argument
431 struct r0conf *conf = mddev->private; in raid0_handle_discard()
448 &mddev->bio_set); in raid0_handle_discard()
460 stripe_size = zone->nb_dev * mddev->chunk_sectors; in raid0_handle_discard()
468 mddev->chunk_sectors; in raid0_handle_discard()
470 mddev->chunk_sectors) + in raid0_handle_discard()
471 first_stripe_index * mddev->chunk_sectors; in raid0_handle_discard()
473 mddev->chunk_sectors; in raid0_handle_discard()
475 mddev->chunk_sectors) + in raid0_handle_discard()
476 last_stripe_index * mddev->chunk_sectors; in raid0_handle_discard()
484 mddev->chunk_sectors; in raid0_handle_discard()
486 dev_start = first_stripe_index * mddev->chunk_sectors; in raid0_handle_discard()
491 dev_end = (last_stripe_index + 1) * mddev->chunk_sectors; in raid0_handle_discard()
493 dev_end = last_stripe_index * mddev->chunk_sectors; in raid0_handle_discard()
502 md_submit_discard_bio(mddev, rdev, bio, in raid0_handle_discard()
509 static bool raid0_make_request(struct mddev *mddev, struct bio *bio) in raid0_make_request() argument
511 struct r0conf *conf = mddev->private; in raid0_make_request()
521 && md_flush_request(mddev, bio)) in raid0_make_request()
525 raid0_handle_discard(mddev, bio); in raid0_make_request()
531 chunk_sects = mddev->chunk_sectors; in raid0_make_request()
543 &mddev->bio_set); in raid0_make_request()
549 if (bio->bi_pool != &mddev->bio_set) in raid0_make_request()
550 md_account_bio(mddev, &bio); in raid0_make_request()
553 zone = find_zone(mddev->private, §or); in raid0_make_request()
556 tmp_dev = map_sector(mddev, zone, orig_sector, §or); in raid0_make_request()
559 tmp_dev = map_sector(mddev, zone, sector, §or); in raid0_make_request()
562 WARN(1, "md/raid0:%s: Invalid layout\n", mdname(mddev)); in raid0_make_request()
576 if (mddev->gendisk) in raid0_make_request()
577 trace_block_bio_remap(bio, disk_devt(mddev->gendisk), in raid0_make_request()
579 mddev_check_writesame(mddev, bio); in raid0_make_request()
580 mddev_check_write_zeroes(mddev, bio); in raid0_make_request()
585 static void raid0_status(struct seq_file *seq, struct mddev *mddev) in raid0_status() argument
587 seq_printf(seq, " %dk chunks", mddev->chunk_sectors / 2); in raid0_status()
591 static void *raid0_takeover_raid45(struct mddev *mddev) in raid0_takeover_raid45() argument
596 if (mddev->degraded != 1) { in raid0_takeover_raid45()
598 mdname(mddev), in raid0_takeover_raid45()
599 mddev->degraded); in raid0_takeover_raid45()
603 rdev_for_each(rdev, mddev) { in raid0_takeover_raid45()
605 if (rdev->raid_disk == mddev->raid_disks-1) { in raid0_takeover_raid45()
607 mdname(mddev)); in raid0_takeover_raid45()
610 rdev->sectors = mddev->dev_sectors; in raid0_takeover_raid45()
614 mddev->new_level = 0; in raid0_takeover_raid45()
615 mddev->new_layout = 0; in raid0_takeover_raid45()
616 mddev->new_chunk_sectors = mddev->chunk_sectors; in raid0_takeover_raid45()
617 mddev->raid_disks--; in raid0_takeover_raid45()
618 mddev->delta_disks = -1; in raid0_takeover_raid45()
620 mddev->recovery_cp = MaxSector; in raid0_takeover_raid45()
621 mddev_clear_unsupported_flags(mddev, UNSUPPORTED_MDDEV_FLAGS); in raid0_takeover_raid45()
623 create_strip_zones(mddev, &priv_conf); in raid0_takeover_raid45()
628 static void *raid0_takeover_raid10(struct mddev *mddev) in raid0_takeover_raid10() argument
638 if (mddev->layout != ((1 << 8) + 2)) { in raid0_takeover_raid10()
640 mdname(mddev), in raid0_takeover_raid10()
641 mddev->layout); in raid0_takeover_raid10()
644 if (mddev->raid_disks & 1) { in raid0_takeover_raid10()
646 mdname(mddev)); in raid0_takeover_raid10()
649 if (mddev->degraded != (mddev->raid_disks>>1)) { in raid0_takeover_raid10()
651 mdname(mddev)); in raid0_takeover_raid10()
656 mddev->new_level = 0; in raid0_takeover_raid10()
657 mddev->new_layout = 0; in raid0_takeover_raid10()
658 mddev->new_chunk_sectors = mddev->chunk_sectors; in raid0_takeover_raid10()
659 mddev->delta_disks = - mddev->raid_disks / 2; in raid0_takeover_raid10()
660 mddev->raid_disks += mddev->delta_disks; in raid0_takeover_raid10()
661 mddev->degraded = 0; in raid0_takeover_raid10()
663 mddev->recovery_cp = MaxSector; in raid0_takeover_raid10()
664 mddev_clear_unsupported_flags(mddev, UNSUPPORTED_MDDEV_FLAGS); in raid0_takeover_raid10()
666 create_strip_zones(mddev, &priv_conf); in raid0_takeover_raid10()
670 static void *raid0_takeover_raid1(struct mddev *mddev) in raid0_takeover_raid1() argument
678 if ((mddev->raid_disks - 1) != mddev->degraded) { in raid0_takeover_raid1()
680 mdname(mddev)); in raid0_takeover_raid1()
691 while (chunksect && (mddev->array_sectors & (chunksect - 1))) in raid0_takeover_raid1()
699 mddev->new_level = 0; in raid0_takeover_raid1()
700 mddev->new_layout = 0; in raid0_takeover_raid1()
701 mddev->new_chunk_sectors = chunksect; in raid0_takeover_raid1()
702 mddev->chunk_sectors = chunksect; in raid0_takeover_raid1()
703 mddev->delta_disks = 1 - mddev->raid_disks; in raid0_takeover_raid1()
704 mddev->raid_disks = 1; in raid0_takeover_raid1()
706 mddev->recovery_cp = MaxSector; in raid0_takeover_raid1()
707 mddev_clear_unsupported_flags(mddev, UNSUPPORTED_MDDEV_FLAGS); in raid0_takeover_raid1()
709 create_strip_zones(mddev, &priv_conf); in raid0_takeover_raid1()
713 static void *raid0_takeover(struct mddev *mddev) in raid0_takeover() argument
722 if (mddev->bitmap) { in raid0_takeover()
724 mdname(mddev)); in raid0_takeover()
727 if (mddev->level == 4) in raid0_takeover()
728 return raid0_takeover_raid45(mddev); in raid0_takeover()
730 if (mddev->level == 5) { in raid0_takeover()
731 if (mddev->layout == ALGORITHM_PARITY_N) in raid0_takeover()
732 return raid0_takeover_raid45(mddev); in raid0_takeover()
735 mdname(mddev), ALGORITHM_PARITY_N); in raid0_takeover()
738 if (mddev->level == 10) in raid0_takeover()
739 return raid0_takeover_raid10(mddev); in raid0_takeover()
741 if (mddev->level == 1) in raid0_takeover()
742 return raid0_takeover_raid1(mddev); in raid0_takeover()
745 mddev->level); in raid0_takeover()
750 static void raid0_quiesce(struct mddev *mddev, int quiesce) in raid0_quiesce() argument