diff options
Diffstat (limited to 'net/ceph')
-rw-r--r-- | net/ceph/crush/mapper.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/net/ceph/crush/mapper.c b/net/ceph/crush/mapper.c index 5549fb609358..91c41fe83113 100644 --- a/net/ceph/crush/mapper.c +++ b/net/ceph/crush/mapper.c | |||
@@ -289,6 +289,7 @@ static int is_out(const struct crush_map *map, | |||
289 | * @type: the type of item to choose | 289 | * @type: the type of item to choose |
290 | * @out: pointer to output vector | 290 | * @out: pointer to output vector |
291 | * @outpos: our position in that vector | 291 | * @outpos: our position in that vector |
292 | * @out_size: size of the out vector | ||
292 | * @tries: number of attempts to make | 293 | * @tries: number of attempts to make |
293 | * @recurse_tries: number of attempts to have recursive chooseleaf make | 294 | * @recurse_tries: number of attempts to have recursive chooseleaf make |
294 | * @local_retries: localized retries | 295 | * @local_retries: localized retries |
@@ -303,6 +304,7 @@ static int crush_choose_firstn(const struct crush_map *map, | |||
303 | const __u32 *weight, int weight_max, | 304 | const __u32 *weight, int weight_max, |
304 | int x, int numrep, int type, | 305 | int x, int numrep, int type, |
305 | int *out, int outpos, | 306 | int *out, int outpos, |
307 | int out_size, | ||
306 | unsigned int tries, | 308 | unsigned int tries, |
307 | unsigned int recurse_tries, | 309 | unsigned int recurse_tries, |
308 | unsigned int local_retries, | 310 | unsigned int local_retries, |
@@ -321,6 +323,7 @@ static int crush_choose_firstn(const struct crush_map *map, | |||
321 | int item = 0; | 323 | int item = 0; |
322 | int itemtype; | 324 | int itemtype; |
323 | int collide, reject; | 325 | int collide, reject; |
326 | int count = out_size; | ||
324 | 327 | ||
325 | dprintk("CHOOSE%s bucket %d x %d outpos %d numrep %d tries %d recurse_tries %d local_retries %d local_fallback_retries %d parent_r %d\n", | 328 | dprintk("CHOOSE%s bucket %d x %d outpos %d numrep %d tries %d recurse_tries %d local_retries %d local_fallback_retries %d parent_r %d\n", |
326 | recurse_to_leaf ? "_LEAF" : "", | 329 | recurse_to_leaf ? "_LEAF" : "", |
@@ -328,7 +331,7 @@ static int crush_choose_firstn(const struct crush_map *map, | |||
328 | tries, recurse_tries, local_retries, local_fallback_retries, | 331 | tries, recurse_tries, local_retries, local_fallback_retries, |
329 | parent_r); | 332 | parent_r); |
330 | 333 | ||
331 | for (rep = outpos; rep < numrep; rep++) { | 334 | for (rep = outpos; rep < numrep && count > 0 ; rep++) { |
332 | /* keep trying until we get a non-out, non-colliding item */ | 335 | /* keep trying until we get a non-out, non-colliding item */ |
333 | ftotal = 0; | 336 | ftotal = 0; |
334 | skip_rep = 0; | 337 | skip_rep = 0; |
@@ -402,7 +405,7 @@ static int crush_choose_firstn(const struct crush_map *map, | |||
402 | map->buckets[-1-item], | 405 | map->buckets[-1-item], |
403 | weight, weight_max, | 406 | weight, weight_max, |
404 | x, outpos+1, 0, | 407 | x, outpos+1, 0, |
405 | out2, outpos, | 408 | out2, outpos, count, |
406 | recurse_tries, 0, | 409 | recurse_tries, 0, |
407 | local_retries, | 410 | local_retries, |
408 | local_fallback_retries, | 411 | local_fallback_retries, |
@@ -462,6 +465,7 @@ reject: | |||
462 | dprintk("CHOOSE got %d\n", item); | 465 | dprintk("CHOOSE got %d\n", item); |
463 | out[outpos] = item; | 466 | out[outpos] = item; |
464 | outpos++; | 467 | outpos++; |
468 | count--; | ||
465 | } | 469 | } |
466 | 470 | ||
467 | dprintk("CHOOSE returns %d\n", outpos); | 471 | dprintk("CHOOSE returns %d\n", outpos); |
@@ -653,6 +657,7 @@ int crush_do_rule(const struct crush_map *map, | |||
653 | __u32 step; | 657 | __u32 step; |
654 | int i, j; | 658 | int i, j; |
655 | int numrep; | 659 | int numrep; |
660 | int out_size; | ||
656 | /* | 661 | /* |
657 | * the original choose_total_tries value was off by one (it | 662 | * the original choose_total_tries value was off by one (it |
658 | * counted "retries" and not "tries"). add one. | 663 | * counted "retries" and not "tries"). add one. |
@@ -760,6 +765,7 @@ int crush_do_rule(const struct crush_map *map, | |||
760 | x, numrep, | 765 | x, numrep, |
761 | curstep->arg2, | 766 | curstep->arg2, |
762 | o+osize, j, | 767 | o+osize, j, |
768 | result_max-osize, | ||
763 | choose_tries, | 769 | choose_tries, |
764 | recurse_tries, | 770 | recurse_tries, |
765 | choose_local_retries, | 771 | choose_local_retries, |
@@ -769,11 +775,13 @@ int crush_do_rule(const struct crush_map *map, | |||
769 | c+osize, | 775 | c+osize, |
770 | 0); | 776 | 0); |
771 | } else { | 777 | } else { |
778 | out_size = ((numrep < (result_max-osize)) ? | ||
779 | numrep : (result_max-osize)); | ||
772 | crush_choose_indep( | 780 | crush_choose_indep( |
773 | map, | 781 | map, |
774 | map->buckets[-1-w[i]], | 782 | map->buckets[-1-w[i]], |
775 | weight, weight_max, | 783 | weight, weight_max, |
776 | x, numrep, numrep, | 784 | x, out_size, numrep, |
777 | curstep->arg2, | 785 | curstep->arg2, |
778 | o+osize, j, | 786 | o+osize, j, |
779 | choose_tries, | 787 | choose_tries, |
@@ -782,7 +790,7 @@ int crush_do_rule(const struct crush_map *map, | |||
782 | recurse_to_leaf, | 790 | recurse_to_leaf, |
783 | c+osize, | 791 | c+osize, |
784 | 0); | 792 | 0); |
785 | osize += numrep; | 793 | osize += out_size; |
786 | } | 794 | } |
787 | } | 795 | } |
788 | 796 | ||