diff options
Diffstat (limited to 'net/ceph')
-rw-r--r-- | net/ceph/crush/mapper.c | 88 |
1 files changed, 33 insertions, 55 deletions
diff --git a/net/ceph/crush/mapper.c b/net/ceph/crush/mapper.c index 77b7a73e65cf..a71f8c4c78ec 100644 --- a/net/ceph/crush/mapper.c +++ b/net/ceph/crush/mapper.c @@ -282,7 +282,7 @@ static int is_out(const struct crush_map *map, } /** - * crush_choose - choose numrep distinct items of given type + * crush_choose_firstn - choose numrep distinct items of given type * @map: the crush_map * @bucket: the bucket we are choose an item from * @x: crush input value @@ -290,18 +290,17 @@ static int is_out(const struct crush_map *map, * @type: the type of item to choose * @out: pointer to output vector * @outpos: our position in that vector - * @firstn: true if choosing "first n" items, false if choosing "indep" * @recurse_to_leaf: true if we want one device under each item of given type * @descend_once: true if we should only try one descent before giving up * @out2: second output vector for leaf items (if @recurse_to_leaf) */ -static int crush_choose(const struct crush_map *map, - struct crush_bucket *bucket, - const __u32 *weight, int weight_max, - int x, int numrep, int type, - int *out, int outpos, - int firstn, int recurse_to_leaf, - int descend_once, int *out2) +static int crush_choose_firstn(const struct crush_map *map, + struct crush_bucket *bucket, + const __u32 *weight, int weight_max, + int x, int numrep, int type, + int *out, int outpos, + int recurse_to_leaf, + int descend_once, int *out2) { int rep; unsigned int ftotal, flocal; @@ -330,26 +329,8 @@ static int crush_choose(const struct crush_map *map, collide = 0; retry_bucket = 0; r = rep; - if (in->alg == CRUSH_BUCKET_UNIFORM) { - /* be careful */ - if (firstn || (__u32)numrep >= in->size) - /* r' = r + f_total */ - r += ftotal; - else if (in->size % numrep == 0) - /* r'=r+(n+1)*f_local */ - r += (numrep+1) * - (flocal+ftotal); - else - /* r' = r + n*f_local */ - r += numrep * (flocal+ftotal); - } else { - if (firstn) - /* r' = r + f_total */ - r += ftotal; - else - /* r' = r + n*f_local */ - r += numrep * (flocal+ftotal); - } + /* r' = r + f_total */ + r += ftotal; /* bucket choose */ if (in->size == 0) { @@ -399,12 +380,12 @@ static int crush_choose(const struct crush_map *map, reject = 0; if (!collide && recurse_to_leaf) { if (item < 0) { - if (crush_choose(map, + if (crush_choose_firstn(map, map->buckets[-1-item], weight, weight_max, x, outpos+1, 0, out2, outpos, - firstn, 0, + 0, map->chooseleaf_descend_once, NULL) <= outpos) /* didn't get leaf */ @@ -455,12 +436,8 @@ reject: } while (retry_descent); if (skip_rep) { - if (firstn) { - dprintk("skip rep\n"); - continue; - } - dprintk("undef rep, continuing\n"); - item = CRUSH_ITEM_UNDEF; + dprintk("skip rep\n"); + continue; } dprintk("CHOOSE got %d\n", item); @@ -474,7 +451,7 @@ reject: /** - * choose indep: alternative breadth-first positionally stable mapping + * crush_choose_indep: alternative breadth-first positionally stable mapping * */ static void crush_choose_indep(const struct crush_map *map, @@ -707,24 +684,25 @@ int crush_do_rule(const struct crush_map *map, } j = 0; if (firstn) { - osize += crush_choose(map, - map->buckets[-1-w[i]], - weight, weight_max, - x, numrep, - curstep->arg2, - o+osize, j, - firstn, - recurse_to_leaf, - descend_once, c+osize); + osize += crush_choose_firstn( + map, + map->buckets[-1-w[i]], + weight, weight_max, + x, numrep, + curstep->arg2, + o+osize, j, + recurse_to_leaf, + descend_once, c+osize); } else { - crush_choose_indep(map, - map->buckets[-1-w[i]], - weight, weight_max, - x, numrep, - curstep->arg2, - o+osize, j, - recurse_to_leaf, - c+osize); + crush_choose_indep( + map, + map->buckets[-1-w[i]], + weight, weight_max, + x, numrep, + curstep->arg2, + o+osize, j, + recurse_to_leaf, + c+osize); osize += numrep; } } |