From 37c507d4307e5eb00aa552ad7700f506cf15662f Mon Sep 17 00:00:00 2001 From: "J.Bruce Fields" Date: Wed, 13 Dec 2006 00:35:26 -0800 Subject: [PATCH] --- yaml --- r: 44504 b: refs/heads/master c: 01f3bd1f03599470e4695392b6ae055ed8506978 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/net/sunrpc/cache.c | 20 +++++++++----------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/[refs] b/[refs] index 85e1b7a4af8d..99d0540aa900 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e0bb89ef031f76dcb9c9d920d18b13948f1418da +refs/heads/master: 01f3bd1f03599470e4695392b6ae055ed8506978 diff --git a/trunk/net/sunrpc/cache.c b/trunk/net/sunrpc/cache.c index 824e8534e022..14274490f92e 100644 --- a/trunk/net/sunrpc/cache.c +++ b/trunk/net/sunrpc/cache.c @@ -530,6 +530,13 @@ static int cache_defer_req(struct cache_req *req, struct cache_head *item) struct cache_deferred_req *dreq; int hash = DFR_HASH(item); + if (cache_defer_cnt >= DFR_MAX) { + /* too much in the cache, randomly drop this one, + * or continue and drop the oldest below + */ + if (net_random()&1) + return -ETIMEDOUT; + } dreq = req->defer(req); if (dreq == NULL) return -ETIMEDOUT; @@ -548,17 +555,8 @@ static int cache_defer_req(struct cache_req *req, struct cache_head *item) /* it is in, now maybe clean up */ dreq = NULL; if (++cache_defer_cnt > DFR_MAX) { - /* too much in the cache, randomly drop - * first or last - */ - if (net_random()&1) - dreq = list_entry(cache_defer_list.next, - struct cache_deferred_req, - recent); - else - dreq = list_entry(cache_defer_list.prev, - struct cache_deferred_req, - recent); + dreq = list_entry(cache_defer_list.prev, + struct cache_deferred_req, recent); list_del(&dreq->recent); list_del(&dreq->hash); cache_defer_cnt--;