From: NeilBrown 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 Signed-off-by: Neil Brown Signed-off-by: Andrew Morton --- 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); _