Blame view

fs/nfs/nfs4renewd.c 4.15 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
  /*
   *  fs/nfs/nfs4renewd.c
   *
   *  Copyright (c) 2002 The Regents of the University of Michigan.
   *  All rights reserved.
   *
   *  Kendrick Smith <kmsmith@umich.edu>
   *
   *  Redistribution and use in source and binary forms, with or without
   *  modification, are permitted provided that the following conditions
   *  are met:
   *
   *  1. Redistributions of source code must retain the above copyright
   *     notice, this list of conditions and the following disclaimer.
   *  2. Redistributions in binary form must reproduce the above copyright
   *     notice, this list of conditions and the following disclaimer in the
   *     documentation and/or other materials provided with the distribution.
   *  3. Neither the name of the University nor the names of its
   *     contributors may be used to endorse or promote products derived
   *     from this software without specific prior written permission.
   *
   *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
   *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
   *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
   *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   *
   * Implementation of the NFSv4 "renew daemon", which wakes up periodically to
   * send a RENEW, to keep state alive on the server.  The daemon is implemented
   * as an rpc_task, not a real kernel thread, so it always runs in rpciod's
   * context.  There is one renewd per nfs_server.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
41
42
43
44
45
46
47
  #include <linux/mm.h>
  #include <linux/pagemap.h>
  #include <linux/sunrpc/sched.h>
  #include <linux/sunrpc/clnt.h>
  
  #include <linux/nfs.h>
  #include <linux/nfs4.h>
  #include <linux/nfs_fs.h>
4ce79717c   Trond Myklebust   [PATCH] NFS: Head...
48
  #include "nfs4_fs.h"
58d9714a4   Trond Myklebust   NFSv4: Send RENEW...
49
  #include "delegation.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
51
52
53
  
  #define NFSDBG_FACILITY	NFSDBG_PROC
  
  void
65f27f384   David Howells   WorkStruct: Pass ...
54
  nfs4_renew_state(struct work_struct *work)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
  {
c48f4f354   Trond Myklebust   NFSv41: Convert t...
56
  	const struct nfs4_state_maintenance_ops *ops;
65f27f384   David Howells   WorkStruct: Pass ...
57
58
  	struct nfs_client *clp =
  		container_of(work, struct nfs_client, cl_renewd.work);
b4454fe1a   Trond Myklebust   NFSv4: Remove req...
59
  	struct rpc_cred *cred;
dc96aef96   Alexandros Batsakis   nfs: prevent back...
60
  	long lease;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
  	unsigned long last, now;
2f60ea6b8   Trond Myklebust   NFSv4: The NFSv4....
62
  	unsigned renew_flags = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63

c48f4f354   Trond Myklebust   NFSv41: Convert t...
64
  	ops = clp->cl_mvops->state_renewal_ops;
3110ff804   Harvey Harrison   nfs: replace rema...
65
66
  	dprintk("%s: start
  ", __func__);
fca5238ef   Chuck Lever   NFS: Allow walkin...
67

d3b4c9d76   Andy Adamson   NFSv4.1: new flag...
68
  	if (test_bit(NFS_CS_STOP_RENEW, &clp->cl_res_state))
58d9714a4   Trond Myklebust   NFSv4: Send RENEW...
69
  		goto out;
fca5238ef   Chuck Lever   NFS: Allow walkin...
70

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
72
73
74
  	spin_lock(&clp->cl_lock);
  	lease = clp->cl_lease_time;
  	last = clp->cl_last_renewal;
  	now = jiffies;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
  	/* Are we close to a lease timeout? */
2f60ea6b8   Trond Myklebust   NFSv4: The NFSv4....
76
77
78
79
80
81
  	if (time_after(now, last + lease/3))
  		renew_flags |= NFS4_RENEW_TIMEOUT;
  	if (nfs_delegations_present(clp))
  		renew_flags |= NFS4_RENEW_DELEGATION_CB;
  
  	if (renew_flags != 0) {
a7b721037   Andy Adamson   nfs41: introduce ...
82
  		cred = ops->get_state_renewal_cred_locked(clp);
b0d3ded1a   Trond Myklebust   NFSv4: Clean up n...
83
  		spin_unlock(&clp->cl_lock);
b4454fe1a   Trond Myklebust   NFSv4: Remove req...
84
  		if (cred == NULL) {
2f60ea6b8   Trond Myklebust   NFSv4: The NFSv4....
85
  			if (!(renew_flags & NFS4_RENEW_DELEGATION_CB)) {
b0d3ded1a   Trond Myklebust   NFSv4: Clean up n...
86
87
88
  				set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
  				goto out;
  			}
58d9714a4   Trond Myklebust   NFSv4: Send RENEW...
89
  			nfs_expire_all_delegations(clp);
b0d3ded1a   Trond Myklebust   NFSv4: Clean up n...
90
91
  		} else {
  			/* Queue an asynchronous RENEW. */
2f60ea6b8   Trond Myklebust   NFSv4: The NFSv4....
92
  			ops->sched_state_renewal(clp, cred, renew_flags);
b0d3ded1a   Trond Myklebust   NFSv4: Clean up n...
93
  			put_rpccred(cred);
dc96aef96   Alexandros Batsakis   nfs: prevent back...
94
  			goto out_exp;
58d9714a4   Trond Myklebust   NFSv4: Send RENEW...
95
  		}
dc96aef96   Alexandros Batsakis   nfs: prevent back...
96
  	} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
98
  		dprintk("%s: failed to call renewd. Reason: lease not expired 
  ",
3110ff804   Harvey Harrison   nfs: replace rema...
99
  				__func__);
dc96aef96   Alexandros Batsakis   nfs: prevent back...
100
101
102
103
  		spin_unlock(&clp->cl_lock);
  	}
  	nfs4_schedule_state_renewal(clp);
  out_exp:
b7391f44f   Trond Myklebust   NFSv4: Return unr...
104
  	nfs_expire_unreferenced_delegations(clp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
  out:
3110ff804   Harvey Harrison   nfs: replace rema...
106
107
  	dprintk("%s: done
  ", __func__);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
109
  void
adfa6f980   David Howells   NFS: Rename struc...
110
  nfs4_schedule_state_renewal(struct nfs_client *clp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111
112
113
114
115
116
117
118
119
120
  {
  	long timeout;
  
  	spin_lock(&clp->cl_lock);
  	timeout = (2 * clp->cl_lease_time) / 3 + (long)clp->cl_last_renewal
  		- (long)jiffies;
  	if (timeout < 5 * HZ)
  		timeout = 5 * HZ;
  	dprintk("%s: requeueing work. Lease period = %ld
  ",
3110ff804   Harvey Harrison   nfs: replace rema...
121
  			__func__, (timeout + HZ - 1) / HZ);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122
123
  	cancel_delayed_work(&clp->cl_renewd);
  	schedule_delayed_work(&clp->cl_renewd, timeout);
5dd3177ae   Trond Myklebust   NFSv4: Fix a use-...
124
  	set_bit(NFS_CS_RENEWD, &clp->cl_res_state);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
125
126
127
128
  	spin_unlock(&clp->cl_lock);
  }
  
  void
adfa6f980   David Howells   NFS: Rename struc...
129
  nfs4_kill_renewd(struct nfs_client *clp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130
  {
3d39c691f   Trond Myklebust   NFS: Replace flus...
131
  	cancel_delayed_work_sync(&clp->cl_renewd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
132
133
134
135
136
137
138
  }
  
  /*
   * Local variables:
   *   c-basic-offset: 8
   * End:
   */