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

The laundromat is freeing any delegation it finds in the RECALL_COMPLETE
state.  But note that RECALL_COMPLETE is the state that the delegation recall
callback leaves the state in.  We shouldn't actually be giving up on the
delegation till either the client has had a chance to call delegreturn, or the
lease time has run out.

Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/fs/nfsd/nfs4state.c |    3 ---
 1 files changed, 3 deletions(-)

diff -puN fs/nfsd/nfs4state.c~nfsd4-fix-laundromat-delegation-reaping fs/nfsd/nfs4state.c
--- 25/fs/nfsd/nfs4state.c~nfsd4-fix-laundromat-delegation-reaping	2005-03-07 23:55:50.000000000 -0800
+++ 25-akpm/fs/nfsd/nfs4state.c	2005-03-07 23:55:50.000000000 -0800
@@ -1861,15 +1861,12 @@ nfs4_laundromat(void)
 	spin_lock(&recall_lock);
 	list_for_each_safe(pos, next, &del_recall_lru) {
 		dp = list_entry (pos, struct nfs4_delegation, dl_recall_lru);
-		if (atomic_read(&dp->dl_state) == NFS4_RECALL_COMPLETE)
-			goto reap;
 		if (time_after((unsigned long)dp->dl_time, (unsigned long)cutoff)) {
 			u = dp->dl_time - cutoff;
 			if (test_val > u)
 				test_val = u;
 			break;
 		}
-reap:
 		dprintk("NFSD: purging unused delegation dp %p, fp %p\n",
 			            dp, dp->dl_flock);
 		release_delegation(dp);
_