if (rv == -EAGAIN)
                cache_defer_req(rqstp, h);
 
-       if (rv && h)
+       if (rv)
                detail->cache_put(h, detail);
        return rv;
 }
        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);
+       }
 }
 
 /*
                /* 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);
        }
                        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);
                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 */