Lines Matching refs:geo

109 	int size = offsetof(struct r10bio, devs[conf->geo.raid_disks]);  in r10bio_pool_alloc()
263 for (i = 0; i < conf->geo.raid_disks; i++) { in put_all_bios()
358 for (slot = 0; slot < conf->geo.raid_disks; slot++) { in find_bio_disk()
587 static void __raid10_find_phys(struct geom *geo, struct r10bio *r10bio) in __raid10_find_phys() argument
597 last_far_set_start = (geo->raid_disks / geo->far_set_size) - 1; in __raid10_find_phys()
598 last_far_set_start *= geo->far_set_size; in __raid10_find_phys()
600 last_far_set_size = geo->far_set_size; in __raid10_find_phys()
601 last_far_set_size += (geo->raid_disks % geo->far_set_size); in __raid10_find_phys()
604 chunk = r10bio->sector >> geo->chunk_shift; in __raid10_find_phys()
605 sector = r10bio->sector & geo->chunk_mask; in __raid10_find_phys()
607 chunk *= geo->near_copies; in __raid10_find_phys()
609 dev = sector_div(stripe, geo->raid_disks); in __raid10_find_phys()
610 if (geo->far_offset) in __raid10_find_phys()
611 stripe *= geo->far_copies; in __raid10_find_phys()
613 sector += stripe << geo->chunk_shift; in __raid10_find_phys()
616 for (n = 0; n < geo->near_copies; n++) { in __raid10_find_phys()
624 for (f = 1; f < geo->far_copies; f++) { in __raid10_find_phys()
625 set = d / geo->far_set_size; in __raid10_find_phys()
626 d += geo->near_copies; in __raid10_find_phys()
628 if ((geo->raid_disks % geo->far_set_size) && in __raid10_find_phys()
634 d %= geo->far_set_size; in __raid10_find_phys()
635 d += geo->far_set_size * set; in __raid10_find_phys()
637 s += geo->stride; in __raid10_find_phys()
643 if (dev >= geo->raid_disks) { in __raid10_find_phys()
645 sector += (geo->chunk_mask + 1); in __raid10_find_phys()
652 struct geom *geo = &conf->geo; in raid10_find_phys() local
658 geo = &conf->prev; in raid10_find_phys()
662 __raid10_find_phys(geo, r10bio); in raid10_find_phys()
671 struct geom *geo = &conf->geo; in raid10_find_virt() local
672 int far_set_start = (dev / geo->far_set_size) * geo->far_set_size; in raid10_find_virt()
673 int far_set_size = geo->far_set_size; in raid10_find_virt()
676 if (geo->raid_disks % geo->far_set_size) { in raid10_find_virt()
677 last_far_set_start = (geo->raid_disks / geo->far_set_size) - 1; in raid10_find_virt()
678 last_far_set_start *= geo->far_set_size; in raid10_find_virt()
681 far_set_size = geo->far_set_size; in raid10_find_virt()
682 far_set_size += (geo->raid_disks % geo->far_set_size); in raid10_find_virt()
687 offset = sector & geo->chunk_mask; in raid10_find_virt()
688 if (geo->far_offset) { in raid10_find_virt()
690 chunk = sector >> geo->chunk_shift; in raid10_find_virt()
691 fc = sector_div(chunk, geo->far_copies); in raid10_find_virt()
692 dev -= fc * geo->near_copies; in raid10_find_virt()
696 while (sector >= geo->stride) { in raid10_find_virt()
697 sector -= geo->stride; in raid10_find_virt()
698 if (dev < (geo->near_copies + far_set_start)) in raid10_find_virt()
699 dev += far_set_size - geo->near_copies; in raid10_find_virt()
701 dev -= geo->near_copies; in raid10_find_virt()
703 chunk = sector >> geo->chunk_shift; in raid10_find_virt()
705 vchunk = chunk * geo->raid_disks + dev; in raid10_find_virt()
706 sector_div(vchunk, geo->near_copies); in raid10_find_virt()
707 return (vchunk << geo->chunk_shift) + offset; in raid10_find_virt()
743 struct geom *geo = &conf->geo; in read_balance() local
848 if (geo->near_copies > 1 && !pending) in read_balance()
852 else if (geo->far_copies > 1) in read_balance()
1583 conf->geo.raid_disks); in __make_request()
1653 struct geom *geo = &conf->geo; in raid10_handle_discard() local
1654 int far_copies = geo->far_copies; in raid10_handle_discard()
1687 if (geo->near_copies) in raid10_handle_discard()
1688 stripe_data_disks = geo->raid_disks / geo->near_copies + in raid10_handle_discard()
1689 geo->raid_disks % geo->near_copies; in raid10_handle_discard()
1691 stripe_data_disks = geo->raid_disks; in raid10_handle_discard()
1693 stripe_size = stripe_data_disks << geo->chunk_shift; in raid10_handle_discard()
1742 chunk = bio_start >> geo->chunk_shift; in raid10_handle_discard()
1743 chunk *= geo->near_copies; in raid10_handle_discard()
1745 start_disk_index = sector_div(first_stripe_index, geo->raid_disks); in raid10_handle_discard()
1746 if (geo->far_offset) in raid10_handle_discard()
1747 first_stripe_index *= geo->far_copies; in raid10_handle_discard()
1748 start_disk_offset = (bio_start & geo->chunk_mask) + in raid10_handle_discard()
1749 (first_stripe_index << geo->chunk_shift); in raid10_handle_discard()
1751 chunk = bio_end >> geo->chunk_shift; in raid10_handle_discard()
1752 chunk *= geo->near_copies; in raid10_handle_discard()
1754 end_disk_index = sector_div(last_stripe_index, geo->raid_disks); in raid10_handle_discard()
1755 if (geo->far_offset) in raid10_handle_discard()
1756 last_stripe_index *= geo->far_copies; in raid10_handle_discard()
1757 end_disk_offset = (bio_end & geo->chunk_mask) + in raid10_handle_discard()
1758 (last_stripe_index << geo->chunk_shift); in raid10_handle_discard()
1765 memset(r10_bio->devs, 0, sizeof(r10_bio->devs[0]) * geo->raid_disks); in raid10_handle_discard()
1789 for (disk = 0; disk < geo->raid_disks; disk++) { in raid10_handle_discard()
1815 for (disk = 0; disk < geo->raid_disks; disk++) { in raid10_handle_discard()
1881 if (!geo->far_offset && --far_copies) { in raid10_handle_discard()
1882 first_stripe_index += geo->stride >> geo->chunk_shift; in raid10_handle_discard()
1883 start_disk_offset += geo->stride; in raid10_handle_discard()
1884 last_stripe_index += geo->stride >> geo->chunk_shift; in raid10_handle_discard()
1885 end_disk_offset += geo->stride; in raid10_handle_discard()
1903 sector_t chunk_mask = (conf->geo.chunk_mask & conf->prev.chunk_mask); in raid10_make_request()
1924 && (conf->geo.near_copies < conf->geo.raid_disks in raid10_make_request()
1942 if (conf->geo.near_copies < conf->geo.raid_disks) in raid10_status()
1944 if (conf->geo.near_copies > 1) in raid10_status()
1945 seq_printf(seq, " %d near-copies", conf->geo.near_copies); in raid10_status()
1946 if (conf->geo.far_copies > 1) { in raid10_status()
1947 if (conf->geo.far_offset) in raid10_status()
1948 seq_printf(seq, " %d offset-copies", conf->geo.far_copies); in raid10_status()
1950 seq_printf(seq, " %d far-copies", conf->geo.far_copies); in raid10_status()
1951 if (conf->geo.far_set_size != conf->geo.raid_disks) in raid10_status()
1952 seq_printf(seq, " %d devices per set", conf->geo.far_set_size); in raid10_status()
1954 seq_printf(seq, " [%d/%d] [", conf->geo.raid_disks, in raid10_status()
1955 conf->geo.raid_disks - mddev->degraded); in raid10_status()
1957 for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_status()
1979 disks = conf->geo.raid_disks; in _enough()
1980 ncopies = conf->geo.near_copies; in _enough()
2059 mdname(mddev), conf->geo.raid_disks - mddev->degraded); in raid10_error()
2072 pr_debug(" --- wd:%d rd:%d\n", conf->geo.raid_disks - conf->mddev->degraded, in print_conf()
2073 conf->geo.raid_disks); in print_conf()
2077 for (i = 0; i < conf->geo.raid_disks; i++) { in print_conf()
2107 for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_spare_active()
2149 int last = conf->geo.raid_disks - 1; in raid10_add_disk()
2167 rdev->saved_raid_disk < conf->geo.raid_disks && in raid10_add_disk()
2244 number < conf->geo.raid_disks && in raid10_remove_disk()
3184 for (i = 0; i < conf->geo.raid_disks; i++) in init_resync()
3245 chunks = conf->geo.raid_disks / conf->geo.near_copies; in raid10_set_cluster_sync_high()
3246 if (conf->geo.raid_disks % conf->geo.near_copies == 0) in raid10_set_cluster_sync_high()
3305 sector_t chunk_mask = conf->geo.chunk_mask; in raid10_sync_request()
3356 else for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_sync_request()
3371 for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_sync_request()
3390 if (chunks_skipped >= conf->geo.raid_disks) { in raid10_sync_request()
3417 if (conf->geo.near_copies < conf->geo.raid_disks && in raid10_sync_request()
3449 for (i = 0 ; i < conf->geo.raid_disks; i++) { in raid10_sync_request()
3526 for (j = 0; j < conf->geo.raid_disks; j++) { in raid10_sync_request()
3863 for (i = 0; i < conf->geo.raid_disks; i++) { in raid10_sync_request()
3936 raid_disks = min(conf->geo.raid_disks, in raid10_size()
3941 size = sectors >> conf->geo.chunk_shift; in raid10_size()
3942 sector_div(size, conf->geo.far_copies); in raid10_size()
3944 sector_div(size, conf->geo.near_copies); in raid10_size()
3946 return size << conf->geo.chunk_shift; in raid10_size()
3956 size = size >> conf->geo.chunk_shift; in calc_sectors()
3957 sector_div(size, conf->geo.far_copies); in calc_sectors()
3958 size = size * conf->geo.raid_disks; in calc_sectors()
3959 sector_div(size, conf->geo.near_copies); in calc_sectors()
3967 size = DIV_ROUND_UP_SECTOR_T(size, conf->geo.raid_disks); in calc_sectors()
3969 conf->dev_sectors = size << conf->geo.chunk_shift; in calc_sectors()
3971 if (conf->geo.far_offset) in calc_sectors()
3972 conf->geo.stride = 1 << conf->geo.chunk_shift; in calc_sectors()
3974 sector_div(size, conf->geo.far_copies); in calc_sectors()
3975 conf->geo.stride = size << conf->geo.chunk_shift; in calc_sectors()
3980 static int setup_geo(struct geom *geo, struct mddev *mddev, enum geo_type new) in setup_geo() argument
4011 geo->raid_disks = disks; in setup_geo()
4012 geo->near_copies = nc; in setup_geo()
4013 geo->far_copies = fc; in setup_geo()
4014 geo->far_offset = fo; in setup_geo()
4017 geo->far_set_size = disks; in setup_geo()
4021 geo->far_set_size = disks/fc; in setup_geo()
4022 WARN(geo->far_set_size < fc, in setup_geo()
4026 geo->far_set_size = fc * nc; in setup_geo()
4031 geo->chunk_mask = chunk - 1; in setup_geo()
4032 geo->chunk_shift = ffz(~chunk); in setup_geo()
4054 struct geom geo; in setup_conf() local
4057 copies = setup_geo(&geo, mddev, geo_new); in setup_conf()
4087 conf->geo = geo; in setup_conf()
4100 conf->prev = conf->geo; in setup_conf()
4139 int raid_disks = conf->geo.raid_disks; in raid10_set_io_opt()
4141 if (!(conf->geo.raid_disks % conf->geo.near_copies)) in raid10_set_io_opt()
4142 raid_disks /= conf->geo.near_copies; in raid10_set_io_opt()
4197 if (disk_idx >= conf->geo.raid_disks && in raid10_run()
4236 if (conf->geo.far_copies != 1 && in raid10_run()
4237 conf->geo.far_offset == 0) in raid10_run()
4246 i < conf->geo.raid_disks in raid10_run()
4281 mdname(mddev), conf->geo.raid_disks - mddev->degraded, in raid10_run()
4282 conf->geo.raid_disks); in raid10_run()
4300 after_length = ((1 << conf->geo.chunk_shift) * in raid10_run()
4301 conf->geo.far_copies); in raid10_run()
4365 if (conf->geo.far_copies > 1 && !conf->geo.far_offset) in raid10_resize()
4464 struct geom geo; in raid10_check_reshape() local
4466 if (conf->geo.far_copies != 1 && !conf->geo.far_offset) in raid10_check_reshape()
4469 if (setup_geo(&geo, mddev, geo_start) != conf->copies) in raid10_check_reshape()
4472 if (geo.far_copies > 1 && !geo.far_offset) in raid10_check_reshape()
4476 if (mddev->array_sectors & geo.chunk_mask) in raid10_check_reshape()
4530 if (conf->geo.raid_disks == conf->prev.raid_disks) in calc_degraded()
4534 for (i = 0; i < conf->geo.raid_disks; i++) { in calc_degraded()
4544 if (conf->geo.raid_disks <= conf->prev.raid_disks) in calc_degraded()
4583 after_length = ((1 << conf->geo.chunk_shift) * in raid10_start_reshape()
4584 conf->geo.far_copies); in raid10_start_reshape()
4620 setup_geo(&conf->geo, mddev, geo_start); in raid10_start_reshape()
4642 newsize = raid10_size(mddev, 0, conf->geo.raid_disks); in raid10_start_reshape()
4705 mddev->raid_disks = conf->geo.raid_disks; in raid10_start_reshape()
4729 conf->geo = conf->prev; in raid10_start_reshape()
4730 mddev->raid_disks = conf->geo.raid_disks; in raid10_start_reshape()
4747 static sector_t last_dev_address(sector_t s, struct geom *geo) in last_dev_address() argument
4749 s = (s | geo->chunk_mask) + 1; in last_dev_address()
4750 s >>= geo->chunk_shift; in last_dev_address()
4751 s *= geo->near_copies; in last_dev_address()
4752 s = DIV_ROUND_UP_SECTOR_T(s, geo->raid_disks); in last_dev_address()
4753 s *= geo->far_copies; in last_dev_address()
4754 s <<= geo->chunk_shift; in last_dev_address()
4762 static sector_t first_dev_address(sector_t s, struct geom *geo) in first_dev_address() argument
4764 s >>= geo->chunk_shift; in first_dev_address()
4765 s *= geo->near_copies; in first_dev_address()
4766 sector_div(s, geo->raid_disks); in first_dev_address()
4767 s *= geo->far_copies; in first_dev_address()
4768 s <<= geo->chunk_shift; in first_dev_address()
4851 &conf->geo); in reshape_request()
4863 sector_nr = last & ~(sector_t)(conf->geo.chunk_mask in reshape_request()
4871 next = last_dev_address(conf->reshape_progress, &conf->geo); in reshape_request()
4885 last = sector_nr | (conf->geo.chunk_mask in reshape_request()
4975 __raid10_find_phys(&conf->geo, r10_bio); in reshape_request()
5104 conf->prev = conf->geo; in end_reshape()
5256 for (d = conf->geo.raid_disks ; in raid10_finish_reshape()
5257 d < conf->geo.raid_disks - mddev->delta_disks; in raid10_finish_reshape()
5269 mddev->chunk_sectors = 1 << conf->geo.chunk_shift; in raid10_finish_reshape()