diff options
Diffstat (limited to 'net/sunrpc/cache.c')
-rw-r--r-- | net/sunrpc/cache.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c index 4449dc52edf5..b242f491cea9 100644 --- a/net/sunrpc/cache.c +++ b/net/sunrpc/cache.c @@ -208,7 +208,7 @@ int cache_check(struct cache_detail *detail, if (rv == -EAGAIN) cache_defer_req(rqstp, h); - if (rv && h) + if (rv) detail->cache_put(h, detail); return rv; } @@ -223,8 +223,10 @@ void cache_fresh(struct cache_detail *detail, head->last_refresh = get_seconds(); if (!test_and_set_bit(CACHE_VALID, &head->flags)) cache_revisit_request(head); - if (test_and_clear_bit(CACHE_PENDING, &head->flags)) + if (test_and_clear_bit(CACHE_PENDING, &head->flags)) { + cache_revisit_request(head); queue_loose(detail, head); + } } /* @@ -551,7 +553,7 @@ static void cache_defer_req(struct cache_req *req, struct cache_head *item) /* there was one too many */ dreq->revisit(dreq, 1); } - if (test_bit(CACHE_VALID, &item->flags)) { + if (!test_bit(CACHE_PENDING, &item->flags)) { /* must have just been validated... */ cache_revisit_request(item); } @@ -892,7 +894,7 @@ static void queue_loose(struct cache_detail *detail, struct cache_head *ch) if (cr->item != ch) continue; if (cr->readers != 0) - break; + continue; list_del(&cr->q.list); spin_unlock(&queue_lock); detail->cache_put(cr->item, detail); @@ -1180,8 +1182,8 @@ static int c_show(struct seq_file *m, void *p) return cd->cache_show(m, cd, NULL); ifdebug(CACHE) - seq_printf(m, "# expiry=%ld refcnt=%d\n", - cp->expiry_time, atomic_read(&cp->refcnt)); + seq_printf(m, "# expiry=%ld refcnt=%d flags=%lx\n", + cp->expiry_time, atomic_read(&cp->refcnt), cp->flags); cache_get(cp); if (cache_check(cd, cp, NULL)) /* cache_check does a cache_put on failure */ |