--- zzzz-none-000/linux-2.6.13.1/net/sunrpc/cache.c 2005-09-10 02:42:58.000000000 +0000 +++ ohio-7170-487/linux-2.6.13.1/net/sunrpc/cache.c 2006-03-14 17:57:46.000000000 +0000 @@ -87,7 +87,7 @@ rv = -ENOENT; } else if (rv == -EAGAIN || age > refresh_age/2) { dprintk("Want update, refage=%ld, age=%ld\n", refresh_age, age); - if (!test_and_set_bit(CACHE_PENDING, &h->flags)) { + if (!test_and_set_bit(CACHE_PENDING, &h->flags)) { switch (cache_make_upcall(detail, h)) { case -EINVAL: clear_bit(CACHE_PENDING, &h->flags); @@ -106,10 +106,10 @@ } } - if (rv == -EAGAIN) + if (rv == -EAGAIN) cache_defer_req(rqstp, h); - if (rv && h) + if (rv && h) detail->cache_put(h, detail); return rv; } @@ -486,7 +486,7 @@ while (!list_empty(&pending)) { dreq = list_entry(pending.next, struct cache_deferred_req, recent); list_del_init(&dreq->recent); - dreq->revisit(dreq, 0); + dreq->revisit(dreq, 0); } } @@ -935,6 +935,12 @@ list_add_tail(&crq->q.list, &detail->queue); spin_unlock(&queue_lock); wake_up(&queue_wait); + + /*--- fix: bei abgelaufenem Cache läuft der NFS-Server amok, die nächsten Zeilen bremsen ihn ---*/ + /*--- dadurch erhält der mountd die Chance den Cache zu aktualisieren, nicht schön aber wirkungsvoll ---*/ + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ<<1); + return 0; }