|
@@ -888,6 +888,7 @@ int crush_do_rule(const struct crush_map *map,
|
|
|
osize = 0;
|
|
|
|
|
|
for (i = 0; i < wsize; i++) {
|
|
|
+ int bno;
|
|
|
/*
|
|
|
* see CRUSH_N, CRUSH_N_MINUS macros.
|
|
|
* basically, numrep <= 0 means relative to
|
|
@@ -900,6 +901,13 @@ int crush_do_rule(const struct crush_map *map,
|
|
|
continue;
|
|
|
}
|
|
|
j = 0;
|
|
|
+ /* make sure bucket id is valid */
|
|
|
+ bno = -1 - w[i];
|
|
|
+ if (bno < 0 || bno >= map->max_buckets) {
|
|
|
+ /* w[i] is probably CRUSH_ITEM_NONE */
|
|
|
+ dprintk(" bad w[i] %d\n", w[i]);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
if (firstn) {
|
|
|
int recurse_tries;
|
|
|
if (choose_leaf_tries)
|
|
@@ -911,7 +919,7 @@ int crush_do_rule(const struct crush_map *map,
|
|
|
recurse_tries = choose_tries;
|
|
|
osize += crush_choose_firstn(
|
|
|
map,
|
|
|
- map->buckets[-1-w[i]],
|
|
|
+ map->buckets[bno],
|
|
|
weight, weight_max,
|
|
|
x, numrep,
|
|
|
curstep->arg2,
|
|
@@ -930,7 +938,7 @@ int crush_do_rule(const struct crush_map *map,
|
|
|
numrep : (result_max-osize));
|
|
|
crush_choose_indep(
|
|
|
map,
|
|
|
- map->buckets[-1-w[i]],
|
|
|
+ map->buckets[bno],
|
|
|
weight, weight_max,
|
|
|
x, out_size, numrep,
|
|
|
curstep->arg2,
|