aboutsummaryrefslogtreecommitdiffstats
path: root/net/ceph
diff options
context:
space:
mode:
authorIlya Dryomov <ilya.dryomov@inktank.com>2013-12-24 14:19:24 -0500
committerIlya Dryomov <ilya.dryomov@inktank.com>2013-12-31 13:32:14 -0500
commite8ef19c4ad161768e1d8309d5ae18481c098eb81 (patch)
tree9ba7cd6965c530228085fba2bf23dcc132ea94d3 /net/ceph
parent2a4ba74ef67ad3a1645d78487ed7ccd0f40063c0 (diff)
crush: eliminate CRUSH_MAX_SET result size limitation
This is only present to size the temporary scratch arrays that we put on the stack. Let the caller allocate them as they wish and remove the limitation. Reflects ceph.git commit 1cfe140bf2dab99517589a82a916f4c75b9492d1. Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com> Reviewed-by: Sage Weil <sage@inktank.com>
Diffstat (limited to 'net/ceph')
-rw-r--r--net/ceph/crush/mapper.c10
-rw-r--r--net/ceph/osdmap.c16
2 files changed, 19 insertions, 7 deletions
diff --git a/net/ceph/crush/mapper.c b/net/ceph/crush/mapper.c
index 82cab7d3e89d..dcf48bc504ea 100644
--- a/net/ceph/crush/mapper.c
+++ b/net/ceph/crush/mapper.c
@@ -478,15 +478,17 @@ reject:
478 * @result_max: maximum result size 478 * @result_max: maximum result size
479 * @weight: weight vector (for map leaves) 479 * @weight: weight vector (for map leaves)
480 * @weight_max: size of weight vector 480 * @weight_max: size of weight vector
481 * @scratch: scratch vector for private use; must be >= 3 * result_max
481 */ 482 */
482int crush_do_rule(const struct crush_map *map, 483int crush_do_rule(const struct crush_map *map,
483 int ruleno, int x, int *result, int result_max, 484 int ruleno, int x, int *result, int result_max,
484 const __u32 *weight, int weight_max) 485 const __u32 *weight, int weight_max,
486 int *scratch)
485{ 487{
486 int result_len; 488 int result_len;
487 int a[CRUSH_MAX_SET]; 489 int *a = scratch;
488 int b[CRUSH_MAX_SET]; 490 int *b = scratch + result_max;
489 int c[CRUSH_MAX_SET]; 491 int *c = scratch + result_max*2;
490 int recurse_to_leaf; 492 int recurse_to_leaf;
491 int *w; 493 int *w;
492 int wsize = 0; 494 int wsize = 0;
diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c
index 6477a68ddecb..8b1a6b48bb5d 100644
--- a/net/ceph/osdmap.c
+++ b/net/ceph/osdmap.c
@@ -1110,6 +1110,16 @@ int ceph_calc_ceph_pg(struct ceph_pg *pg, const char *oid,
1110} 1110}
1111EXPORT_SYMBOL(ceph_calc_ceph_pg); 1111EXPORT_SYMBOL(ceph_calc_ceph_pg);
1112 1112
1113static int crush_do_rule_ary(const struct crush_map *map, int ruleno, int x,
1114 int *result, int result_max,
1115 const __u32 *weight, int weight_max)
1116{
1117 int scratch[result_max * 3];
1118
1119 return crush_do_rule(map, ruleno, x, result, result_max,
1120 weight, weight_max, scratch);
1121}
1122
1113/* 1123/*
1114 * Calculate raw osd vector for the given pgid. Return pointer to osd 1124 * Calculate raw osd vector for the given pgid. Return pointer to osd
1115 * array, or NULL on failure. 1125 * array, or NULL on failure.
@@ -1163,9 +1173,9 @@ static int *calc_pg_raw(struct ceph_osdmap *osdmap, struct ceph_pg pgid,
1163 pool->pgp_num_mask) + 1173 pool->pgp_num_mask) +
1164 (unsigned)pgid.pool; 1174 (unsigned)pgid.pool;
1165 } 1175 }
1166 r = crush_do_rule(osdmap->crush, ruleno, pps, osds, 1176 r = crush_do_rule_ary(osdmap->crush, ruleno, pps,
1167 min_t(int, pool->size, *num), 1177 osds, min_t(int, pool->size, *num),
1168 osdmap->osd_weight, osdmap->max_osd); 1178 osdmap->osd_weight, osdmap->max_osd);
1169 if (r < 0) { 1179 if (r < 0) {
1170 pr_err("error %d from crush rule: pool %lld ruleset %d type %d" 1180 pr_err("error %d from crush rule: pool %lld ruleset %d type %d"
1171 " size %d\n", r, pgid.pool, pool->crush_ruleset, 1181 " size %d\n", r, pgid.pool, pool->crush_ruleset,