diff options
Diffstat (limited to 'net/ceph/osdmap.c')
-rw-r--r-- | net/ceph/osdmap.c | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c index 378471644501..69bc4bf89e3e 100644 --- a/net/ceph/osdmap.c +++ b/net/ceph/osdmap.c | |||
@@ -1127,18 +1127,16 @@ static int *calc_pg_raw(struct ceph_osdmap *osdmap, struct ceph_pg pgid, | |||
1127 | struct ceph_pg_mapping *pg; | 1127 | struct ceph_pg_mapping *pg; |
1128 | struct ceph_pg_pool_info *pool; | 1128 | struct ceph_pg_pool_info *pool; |
1129 | int ruleno; | 1129 | int ruleno; |
1130 | unsigned int poolid, ps, pps, t, r; | 1130 | int r; |
1131 | u32 pps; | ||
1131 | 1132 | ||
1132 | poolid = pgid.pool; | 1133 | pool = __lookup_pg_pool(&osdmap->pg_pools, pgid.pool); |
1133 | ps = pgid.seed; | ||
1134 | |||
1135 | pool = __lookup_pg_pool(&osdmap->pg_pools, poolid); | ||
1136 | if (!pool) | 1134 | if (!pool) |
1137 | return NULL; | 1135 | return NULL; |
1138 | 1136 | ||
1139 | /* pg_temp? */ | 1137 | /* pg_temp? */ |
1140 | t = ceph_stable_mod(ps, pool->pg_num, pool->pgp_num_mask); | 1138 | pgid.seed = ceph_stable_mod(pgid.seed, pool->pg_num, |
1141 | pgid.seed = t; | 1139 | pool->pgp_num_mask); |
1142 | pg = __lookup_pg_mapping(&osdmap->pg_temp, pgid); | 1140 | pg = __lookup_pg_mapping(&osdmap->pg_temp, pgid); |
1143 | if (pg) { | 1141 | if (pg) { |
1144 | *num = pg->len; | 1142 | *num = pg->len; |
@@ -1149,20 +1147,35 @@ static int *calc_pg_raw(struct ceph_osdmap *osdmap, struct ceph_pg pgid, | |||
1149 | ruleno = crush_find_rule(osdmap->crush, pool->crush_ruleset, | 1147 | ruleno = crush_find_rule(osdmap->crush, pool->crush_ruleset, |
1150 | pool->type, pool->size); | 1148 | pool->type, pool->size); |
1151 | if (ruleno < 0) { | 1149 | if (ruleno < 0) { |
1152 | pr_err("no crush rule pool %d ruleset %d type %d size %d\n", | 1150 | pr_err("no crush rule pool %lld ruleset %d type %d size %d\n", |
1153 | poolid, pool->crush_ruleset, pool->type, | 1151 | pgid.pool, pool->crush_ruleset, pool->type, |
1154 | pool->size); | 1152 | pool->size); |
1155 | return NULL; | 1153 | return NULL; |
1156 | } | 1154 | } |
1157 | 1155 | ||
1158 | pps = ceph_stable_mod(ps, pool->pgp_num, pool->pgp_num_mask); | 1156 | if (pool->flags & CEPH_POOL_FLAG_HASHPSPOOL) { |
1159 | pps += poolid; | 1157 | /* hash pool id and seed sothat pool PGs do not overlap */ |
1158 | pps = crush_hash32_2(CRUSH_HASH_RJENKINS1, | ||
1159 | ceph_stable_mod(pgid.seed, pool->pgp_num, | ||
1160 | pool->pgp_num_mask), | ||
1161 | pgid.pool); | ||
1162 | } else { | ||
1163 | /* | ||
1164 | * legacy ehavior: add ps and pool together. this is | ||
1165 | * not a great approach because the PGs from each pool | ||
1166 | * will overlap on top of each other: 0.5 == 1.4 == | ||
1167 | * 2.3 == ... | ||
1168 | */ | ||
1169 | pps = ceph_stable_mod(pgid.seed, pool->pgp_num, | ||
1170 | pool->pgp_num_mask) + | ||
1171 | (unsigned)pgid.pool; | ||
1172 | } | ||
1160 | r = crush_do_rule(osdmap->crush, ruleno, pps, osds, | 1173 | r = crush_do_rule(osdmap->crush, ruleno, pps, osds, |
1161 | min_t(int, pool->size, *num), | 1174 | min_t(int, pool->size, *num), |
1162 | osdmap->osd_weight); | 1175 | osdmap->osd_weight); |
1163 | if (r < 0) { | 1176 | if (r < 0) { |
1164 | pr_err("error %d from crush rule: pool %d ruleset %d type %d" | 1177 | pr_err("error %d from crush rule: pool %lld ruleset %d type %d" |
1165 | " size %d\n", r, poolid, pool->crush_ruleset, | 1178 | " size %d\n", r, pgid.pool, pool->crush_ruleset, |
1166 | pool->type, pool->size); | 1179 | pool->type, pool->size); |
1167 | return NULL; | 1180 | return NULL; |
1168 | } | 1181 | } |