Lines Matching refs:geo

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