[PATCH] knfsd: svcrpc: remove another silent drop from deferral code
authorJ.Bruce Fields <bfields@fieldses.org>
Wed, 13 Dec 2006 08:35:26 +0000 (00:35 -0800)
committerLinus Torvalds <torvalds@woody.osdl.org>
Wed, 13 Dec 2006 17:05:54 +0000 (09:05 -0800)
There's no point deferring something just to immediately fail the deferral,
especially now that we can do something more useful in the failure case by
returning an error.

Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
net/sunrpc/cache.c

index 824e853..1427449 100644 (file)
@@ -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--;