From 6f82d00333768b2a005c15b7f3a41d2aac46dea9 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 7 Oct 2009 10:59:34 -0700 Subject: [PATCH] --- yaml --- r: 188566 b: refs/heads/master c: b28813a61d6ffe05ad353a86965607bb7a7fd60f h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/ceph/crush/mapper.c | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 899e3b262a42..d34a27b156fa 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b195befd9acb514dd2afb722e63fdd880ed63217 +refs/heads/master: b28813a61d6ffe05ad353a86965607bb7a7fd60f diff --git a/trunk/fs/ceph/crush/mapper.c b/trunk/fs/ceph/crush/mapper.c index 0f0730c62695..c268393adfcb 100644 --- a/trunk/fs/ceph/crush/mapper.c +++ b/trunk/fs/ceph/crush/mapper.c @@ -299,7 +299,7 @@ static int crush_choose(struct crush_map *map, struct crush_bucket *in = bucket; int r; int i; - int item; + int item = 0; int itemtype; int collide, reject; const int orig_tries = 5; /* attempts before we fall back to search */ @@ -316,6 +316,7 @@ static int crush_choose(struct crush_map *map, /* choose through intervening buckets */ flocal = 0; do { + collide = 0; retry_bucket = 0; r = rep; if (in->alg == CRUSH_BUCKET_UNIFORM) { @@ -340,6 +341,10 @@ static int crush_choose(struct crush_map *map, } /* bucket choose */ + if (in->size == 0) { + reject = 1; + goto reject; + } if (flocal >= (in->size>>1) && flocal > orig_tries) item = bucket_perm_choose(in, x, r); @@ -363,7 +368,6 @@ static int crush_choose(struct crush_map *map, } /* collision? */ - collide = 0; for (i = 0; i < outpos; i++) { if (out[i] == item) { collide = 1; @@ -388,6 +392,7 @@ static int crush_choose(struct crush_map *map, reject = 0; } +reject: if (reject || collide) { ftotal++; flocal++;