diff options
Diffstat (limited to 'net/sunrpc/cache.c')
-rw-r--r-- | net/sunrpc/cache.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c index 80aff0474572..824e8534e022 100644 --- a/net/sunrpc/cache.c +++ b/net/sunrpc/cache.c | |||
@@ -34,7 +34,7 @@ | |||
34 | 34 | ||
35 | #define RPCDBG_FACILITY RPCDBG_CACHE | 35 | #define RPCDBG_FACILITY RPCDBG_CACHE |
36 | 36 | ||
37 | static void cache_defer_req(struct cache_req *req, struct cache_head *item); | 37 | static int cache_defer_req(struct cache_req *req, struct cache_head *item); |
38 | static void cache_revisit_request(struct cache_head *item); | 38 | static void cache_revisit_request(struct cache_head *item); |
39 | 39 | ||
40 | static void cache_init(struct cache_head *h) | 40 | static void cache_init(struct cache_head *h) |
@@ -185,6 +185,7 @@ static int cache_make_upcall(struct cache_detail *detail, struct cache_head *h); | |||
185 | * | 185 | * |
186 | * Returns 0 if the cache_head can be used, or cache_puts it and returns | 186 | * Returns 0 if the cache_head can be used, or cache_puts it and returns |
187 | * -EAGAIN if upcall is pending, | 187 | * -EAGAIN if upcall is pending, |
188 | * -ETIMEDOUT if upcall failed and should be retried, | ||
188 | * -ENOENT if cache entry was negative | 189 | * -ENOENT if cache entry was negative |
189 | */ | 190 | */ |
190 | int cache_check(struct cache_detail *detail, | 191 | int cache_check(struct cache_detail *detail, |
@@ -236,7 +237,8 @@ int cache_check(struct cache_detail *detail, | |||
236 | } | 237 | } |
237 | 238 | ||
238 | if (rv == -EAGAIN) | 239 | if (rv == -EAGAIN) |
239 | cache_defer_req(rqstp, h); | 240 | if (cache_defer_req(rqstp, h) != 0) |
241 | rv = -ETIMEDOUT; | ||
240 | 242 | ||
241 | if (rv) | 243 | if (rv) |
242 | cache_put(h, detail); | 244 | cache_put(h, detail); |
@@ -523,14 +525,14 @@ static LIST_HEAD(cache_defer_list); | |||
523 | static struct list_head cache_defer_hash[DFR_HASHSIZE]; | 525 | static struct list_head cache_defer_hash[DFR_HASHSIZE]; |
524 | static int cache_defer_cnt; | 526 | static int cache_defer_cnt; |
525 | 527 | ||
526 | static void cache_defer_req(struct cache_req *req, struct cache_head *item) | 528 | static int cache_defer_req(struct cache_req *req, struct cache_head *item) |
527 | { | 529 | { |
528 | struct cache_deferred_req *dreq; | 530 | struct cache_deferred_req *dreq; |
529 | int hash = DFR_HASH(item); | 531 | int hash = DFR_HASH(item); |
530 | 532 | ||
531 | dreq = req->defer(req); | 533 | dreq = req->defer(req); |
532 | if (dreq == NULL) | 534 | if (dreq == NULL) |
533 | return; | 535 | return -ETIMEDOUT; |
534 | 536 | ||
535 | dreq->item = item; | 537 | dreq->item = item; |
536 | dreq->recv_time = get_seconds(); | 538 | dreq->recv_time = get_seconds(); |
@@ -571,6 +573,7 @@ static void cache_defer_req(struct cache_req *req, struct cache_head *item) | |||
571 | /* must have just been validated... */ | 573 | /* must have just been validated... */ |
572 | cache_revisit_request(item); | 574 | cache_revisit_request(item); |
573 | } | 575 | } |
576 | return 0; | ||
574 | } | 577 | } |
575 | 578 | ||
576 | static void cache_revisit_request(struct cache_head *item) | 579 | static void cache_revisit_request(struct cache_head *item) |