From: NeilBrown <neilb@cse.unsw.edu.au>

To purge an nfsd-authentication cache, we set the flush time to later than
last-refresh time in the cache and call cache_flush.  The easiest way to
find 'later than last-refresh' is 'now+1'.

This has two problems.

  1/ if the time-of-day clock has gone bacwards, some entries might not
     be purged
  2/ if a new entry is added in the same second as cache_purge ran, it will
     get ignored.

To resolve these issues, we set the flushtime to the maximum possible time
before calling cache_flush, and then set it back to the minimum time
afterwards.

Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/net/sunrpc/cache.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletion(-)

diff -puN net/sunrpc/cache.c~knfsd-fix-race-with-flushing-nfsd-cache net/sunrpc/cache.c
--- 25/net/sunrpc/cache.c~knfsd-fix-race-with-flushing-nfsd-cache	2004-08-20 00:01:02.230338168 -0700
+++ 25-akpm/net/sunrpc/cache.c	2004-08-20 00:01:02.233337712 -0700
@@ -400,9 +400,10 @@ void cache_flush(void)
 
 void cache_purge(struct cache_detail *detail)
 {
-	detail->flush_time = get_seconds()+1;
+	detail->flush_time = LONG_MAX;
 	detail->nextcheck = get_seconds();
 	cache_flush();
+	detail->flush_time = 1;
 }
 
 
_