Lines Matching refs:geo
597 static void __raid10_find_phys(struct geom *geo, struct r10bio *r10bio) in __raid10_find_phys() argument
607 last_far_set_start = (geo->raid_disks / geo->far_set_size) - 1; in __raid10_find_phys()
608 last_far_set_start *= geo->far_set_size; in __raid10_find_phys()
610 last_far_set_size = geo->far_set_size; in __raid10_find_phys()
611 last_far_set_size += (geo->raid_disks % geo->far_set_size); in __raid10_find_phys()
614 chunk = r10bio->sector >> geo->chunk_shift; in __raid10_find_phys()
615 sector = r10bio->sector & geo->chunk_mask; in __raid10_find_phys()
617 chunk *= geo->near_copies; in __raid10_find_phys()
619 dev = sector_div(stripe, geo->raid_disks); in __raid10_find_phys()
620 if (geo->far_offset) in __raid10_find_phys()
621 stripe *= geo->far_copies; in __raid10_find_phys()
623 sector += stripe << geo->chunk_shift; in __raid10_find_phys()
626 for (n = 0; n < geo->near_copies; n++) { in __raid10_find_phys()
634 for (f = 1; f < geo->far_copies; f++) { in __raid10_find_phys()
635 set = d / geo->far_set_size; in __raid10_find_phys()
636 d += geo->near_copies; in __raid10_find_phys()
638 if ((geo->raid_disks % geo->far_set_size) && in __raid10_find_phys()
644 d %= geo->far_set_size; in __raid10_find_phys()
645 d += geo->far_set_size * set; in __raid10_find_phys()
647 s += geo->stride; in __raid10_find_phys()
653 if (dev >= geo->raid_disks) { in __raid10_find_phys()
655 sector += (geo->chunk_mask + 1); in __raid10_find_phys()
662 struct geom *geo = &conf->geo; in raid10_find_phys() local
668 geo = &conf->prev; in raid10_find_phys()
672 __raid10_find_phys(geo, r10bio); in raid10_find_phys()
681 struct geom *geo = &conf->geo; in raid10_find_virt() local
682 int far_set_start = (dev / geo->far_set_size) * geo->far_set_size; in raid10_find_virt()
683 int far_set_size = geo->far_set_size; in raid10_find_virt()
686 if (geo->raid_disks % geo->far_set_size) { in raid10_find_virt()
687 last_far_set_start = (geo->raid_disks / geo->far_set_size) - 1; in raid10_find_virt()
688 last_far_set_start *= geo->far_set_size; in raid10_find_virt()
691 far_set_size = geo->far_set_size; in raid10_find_virt()
692 far_set_size += (geo->raid_disks % geo->far_set_size); in raid10_find_virt()
697 offset = sector & geo->chunk_mask; in raid10_find_virt()
698 if (geo->far_offset) { in raid10_find_virt()
700 chunk = sector >> geo->chunk_shift; in raid10_find_virt()
701 fc = sector_div(chunk, geo->far_copies); in raid10_find_virt()
702 dev -= fc * geo->near_copies; in raid10_find_virt()
706 while (sector >= geo->stride) { in raid10_find_virt()
707 sector -= geo->stride; in raid10_find_virt()
708 if (dev < (geo->near_copies + far_set_start)) in raid10_find_virt()
709 dev += far_set_size - geo->near_copies; in raid10_find_virt()
711 dev -= geo->near_copies; in raid10_find_virt()
713 chunk = sector >> geo->chunk_shift; in raid10_find_virt()
715 vchunk = chunk * geo->raid_disks + dev; in raid10_find_virt()
716 sector_div(vchunk, geo->near_copies); in raid10_find_virt()
717 return (vchunk << geo->chunk_shift) + offset; in raid10_find_virt()
751 struct geom *geo = &conf->geo; in read_balance() local
835 if (geo->near_copies > 1 && !atomic_read(&rdev->nr_pending)) in read_balance()
839 else if (geo->far_copies > 1) in read_balance()
877 (i < conf->geo.raid_disks || i < conf->prev.raid_disks) in raid10_congested()
1557 sector_t chunk_mask = (conf->geo.chunk_mask & conf->prev.chunk_mask); in raid10_make_request()
1575 && (conf->geo.near_copies < conf->geo.raid_disks in raid10_make_request()
1593 if (conf->geo.near_copies < conf->geo.raid_disks) in raid10_status()
1595 if (conf->geo.near_copies > 1) in raid10_status()
1596 seq_printf(seq, " %d near-copies", conf->geo.near_copies); in raid10_status()
1597 if (conf->geo.far_copies > 1) { in raid10_status()
1598 if (conf->geo.far_offset) in raid10_status()
1599 seq_printf(seq, " %d offset-copies", conf->geo.far_copies); in raid10_status()
1601 seq_printf(seq, " %d far-copies", conf->geo.far_copies); in raid10_status()
1602 if (conf->geo.far_set_size != conf->geo.raid_disks) in raid10_status()
1603 seq_printf(seq, " %d devices per set", conf->geo.far_set_size); in raid10_status()
1605 seq_printf(seq, " [%d/%d] [", conf->geo.raid_disks, in raid10_status()
1606 conf->geo.raid_disks - mddev->degraded); in raid10_status()
1608 for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_status()
1630 disks = conf->geo.raid_disks; in _enough()
1631 ncopies = conf->geo.near_copies; in _enough()
1703 mdname(mddev), conf->geo.raid_disks - mddev->degraded); in raid10_error()
1716 pr_debug(" --- wd:%d rd:%d\n", conf->geo.raid_disks - conf->mddev->degraded, in print_conf()
1717 conf->geo.raid_disks); in print_conf()
1721 for (i = 0; i < conf->geo.raid_disks; i++) { in print_conf()
1752 for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_spare_active()
1794 int last = conf->geo.raid_disks - 1; in raid10_add_disk()
1882 number < conf->geo.raid_disks && in raid10_remove_disk()
2825 for (i = 0; i < conf->geo.raid_disks; i++) in init_resync()
2886 chunks = conf->geo.raid_disks / conf->geo.near_copies; in raid10_set_cluster_sync_high()
2887 if (conf->geo.raid_disks % conf->geo.near_copies == 0) in raid10_set_cluster_sync_high()
2946 sector_t chunk_mask = conf->geo.chunk_mask; in raid10_sync_request()
2996 else for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_sync_request()
3011 for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_sync_request()
3030 if (chunks_skipped >= conf->geo.raid_disks) { in raid10_sync_request()
3044 if (conf->geo.near_copies < conf->geo.raid_disks && in raid10_sync_request()
3076 for (i = 0 ; i < conf->geo.raid_disks; i++) { in raid10_sync_request()
3152 for (j = 0; j < conf->geo.raid_disks; j++) { in raid10_sync_request()
3490 for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_sync_request()
3563 raid_disks = min(conf->geo.raid_disks, in raid10_size()
3568 size = sectors >> conf->geo.chunk_shift; in raid10_size()
3569 sector_div(size, conf->geo.far_copies); in raid10_size()
3571 sector_div(size, conf->geo.near_copies); in raid10_size()
3573 return size << conf->geo.chunk_shift; in raid10_size()
3583 size = size >> conf->geo.chunk_shift; in calc_sectors()
3584 sector_div(size, conf->geo.far_copies); in calc_sectors()
3585 size = size * conf->geo.raid_disks; in calc_sectors()
3586 sector_div(size, conf->geo.near_copies); in calc_sectors()
3594 size = DIV_ROUND_UP_SECTOR_T(size, conf->geo.raid_disks); in calc_sectors()
3596 conf->dev_sectors = size << conf->geo.chunk_shift; in calc_sectors()
3598 if (conf->geo.far_offset) in calc_sectors()
3599 conf->geo.stride = 1 << conf->geo.chunk_shift; in calc_sectors()
3601 sector_div(size, conf->geo.far_copies); in calc_sectors()
3602 conf->geo.stride = size << conf->geo.chunk_shift; in calc_sectors()
3607 static int setup_geo(struct geom *geo, struct mddev *mddev, enum geo_type new) in setup_geo() argument
3638 geo->raid_disks = disks; in setup_geo()
3639 geo->near_copies = nc; in setup_geo()
3640 geo->far_copies = fc; in setup_geo()
3641 geo->far_offset = fo; in setup_geo()
3644 geo->far_set_size = disks; in setup_geo()
3648 geo->far_set_size = disks/fc; in setup_geo()
3649 WARN(geo->far_set_size < fc, in setup_geo()
3653 geo->far_set_size = fc * nc; in setup_geo()
3658 geo->chunk_mask = chunk - 1; in setup_geo()
3659 geo->chunk_shift = ffz(~chunk); in setup_geo()
3667 struct geom geo; in setup_conf() local
3670 copies = setup_geo(&geo, mddev, geo_new); in setup_conf()
3700 conf->geo = geo; in setup_conf()
3713 conf->prev = conf->geo; in setup_conf()
3801 if (conf->geo.raid_disks % conf->geo.near_copies) in raid10_run()
3802 blk_queue_io_opt(mddev->queue, chunk_size * conf->geo.raid_disks); in raid10_run()
3805 (conf->geo.raid_disks / conf->geo.near_copies)); in raid10_run()
3814 if (disk_idx >= conf->geo.raid_disks && in raid10_run()
3864 if (conf->geo.far_copies != 1 && in raid10_run()
3865 conf->geo.far_offset == 0) in raid10_run()
3874 i < conf->geo.raid_disks in raid10_run()
3909 mdname(mddev), conf->geo.raid_disks - mddev->degraded, in raid10_run()
3910 conf->geo.raid_disks); in raid10_run()
3921 int stripe = conf->geo.raid_disks * in raid10_run()
3928 stripe /= conf->geo.near_copies; in raid10_run()
3941 after_length = ((1 << conf->geo.chunk_shift) * in raid10_run()
3942 conf->geo.far_copies); in raid10_run()
4015 if (conf->geo.far_copies > 1 && !conf->geo.far_offset) in raid10_resize()
4115 struct geom geo; in raid10_check_reshape() local
4117 if (conf->geo.far_copies != 1 && !conf->geo.far_offset) in raid10_check_reshape()
4120 if (setup_geo(&geo, mddev, geo_start) != conf->copies) in raid10_check_reshape()
4123 if (geo.far_copies > 1 && !geo.far_offset) in raid10_check_reshape()
4127 if (mddev->array_sectors & geo.chunk_mask) in raid10_check_reshape()
4181 if (conf->geo.raid_disks == conf->prev.raid_disks) in calc_degraded()
4185 for (i = 0; i < conf->geo.raid_disks; i++) { in calc_degraded()
4195 if (conf->geo.raid_disks <= conf->prev.raid_disks) in calc_degraded()
4234 after_length = ((1 << conf->geo.chunk_shift) * in raid10_start_reshape()
4235 conf->geo.far_copies); in raid10_start_reshape()
4271 setup_geo(&conf->geo, mddev, geo_start); in raid10_start_reshape()
4290 raid10_size(mddev, 0, conf->geo.raid_disks), in raid10_start_reshape()
4322 mddev->raid_disks = conf->geo.raid_disks; in raid10_start_reshape()
4346 conf->geo = conf->prev; in raid10_start_reshape()
4347 mddev->raid_disks = conf->geo.raid_disks; in raid10_start_reshape()
4364 static sector_t last_dev_address(sector_t s, struct geom *geo) in last_dev_address() argument
4366 s = (s | geo->chunk_mask) + 1; in last_dev_address()
4367 s >>= geo->chunk_shift; in last_dev_address()
4368 s *= geo->near_copies; in last_dev_address()
4369 s = DIV_ROUND_UP_SECTOR_T(s, geo->raid_disks); in last_dev_address()
4370 s *= geo->far_copies; in last_dev_address()
4371 s <<= geo->chunk_shift; in last_dev_address()
4379 static sector_t first_dev_address(sector_t s, struct geom *geo) in first_dev_address() argument
4381 s >>= geo->chunk_shift; in first_dev_address()
4382 s *= geo->near_copies; in first_dev_address()
4383 sector_div(s, geo->raid_disks); in first_dev_address()
4384 s *= geo->far_copies; in first_dev_address()
4385 s <<= geo->chunk_shift; in first_dev_address()
4468 &conf->geo); in reshape_request()
4480 sector_nr = last & ~(sector_t)(conf->geo.chunk_mask in reshape_request()
4488 next = last_dev_address(conf->reshape_progress, &conf->geo); in reshape_request()
4502 last = sector_nr | (conf->geo.chunk_mask in reshape_request()
4572 __raid10_find_phys(&conf->geo, r10_bio); in reshape_request()
4702 conf->prev = conf->geo; in end_reshape()
4713 int stripe = conf->geo.raid_disks * in end_reshape()
4715 stripe /= conf->geo.near_copies; in end_reshape()
4850 for (d = conf->geo.raid_disks ; in raid10_finish_reshape()
4851 d < conf->geo.raid_disks - mddev->delta_disks; in raid10_finish_reshape()
4863 mddev->chunk_sectors = 1 << conf->geo.chunk_shift; in raid10_finish_reshape()