aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorNeil Brown <neilb@cse.unsw.edu.au>2005-01-04 05:52:26 -0800
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-01-04 05:52:26 -0800
commit67dbf11eff5140b186297fc8300c246d4dec7baf (patch)
treed040aeb16eda966706118d58179b361925085e0d /fs
parentab5e347f143f8138d24b77d9daa7ff2b5184355b (diff)
downloadhistory-67dbf11eff5140b186297fc8300c246d4dec7baf.tar.gz
[PATCH] knfsd: add to the laundromat service for delegations.
Walk the recall_lru and reap unused or timed-out delegations. Signed-off-by: Andy Adamson <andros@citi.umich.edu> Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs')
-rw-r--r--fs/nfsd/nfs4state.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 03db87d5a63a4a..51526f9d00d88c 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1844,14 +1844,15 @@ nfs4_laundromat(void)
{
struct nfs4_client *clp;
struct nfs4_stateowner *sop;
+ struct nfs4_delegation *dp;
struct list_head *pos, *next;
time_t cutoff = get_seconds() - NFSD_LEASE_TIME;
time_t t, clientid_val = NFSD_LEASE_TIME;
- time_t u, close_val = NFSD_LEASE_TIME;
+ time_t u, test_val = NFSD_LEASE_TIME;
nfs4_lock_state();
- dprintk("NFSD: laundromat service - starting, examining clients\n");
+ dprintk("NFSD: laundromat service - starting\n");
list_for_each_safe(pos, next, &client_lru) {
clp = list_entry(pos, struct nfs4_client, cl_lru);
if (time_after((unsigned long)clp->cl_time, (unsigned long)cutoff)) {
@@ -1864,12 +1865,30 @@ nfs4_laundromat(void)
clp->cl_clientid.cl_id);
expire_client(clp);
}
+ 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);
+ }
+ spin_unlock(&recall_lock);
+ test_val = NFSD_LEASE_TIME;
list_for_each_safe(pos, next, &close_lru) {
sop = list_entry(pos, struct nfs4_stateowner, so_close_lru);
if (time_after((unsigned long)sop->so_time, (unsigned long)cutoff)) {
u = sop->so_time - cutoff;
- if (close_val > u)
- close_val = u;
+ if (test_val > u)
+ test_val = u;
break;
}
dprintk("NFSD: purging unused open stateowner (so_id %d)\n",