Blame view

fs/nfs/nfs4renewd.c 4.54 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

e3c0fb7ef   Chuck Lever   NFS: Add NFSDBG_S...
51
  #define NFSDBG_FACILITY		NFSDBG_STATE
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
  
  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);
a52458b48   NeilBrown   NFS/NFSD/SUNRPC: ...
59
  	const struct 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
  	lease = clp->cl_lease_time;
  	last = clp->cl_last_renewal;
  	now = jiffies;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
  	/* Are we close to a lease timeout? */
2f60ea6b8   Trond Myklebust   NFSv4: The NFSv4....
75
76
77
78
79
80
  	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) {
f15e1e8bc   NeilBrown   NFSv4: don't requ...
81
  		cred = ops->get_state_renewal_cred(clp);
b4454fe1a   Trond Myklebust   NFSv4: Remove req...
82
  		if (cred == NULL) {
2f60ea6b8   Trond Myklebust   NFSv4: The NFSv4....
83
  			if (!(renew_flags & NFS4_RENEW_DELEGATION_CB)) {
b0d3ded1a   Trond Myklebust   NFSv4: Clean up n...
84
85
86
  				set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
  				goto out;
  			}
58d9714a4   Trond Myklebust   NFSv4: Send RENEW...
87
  			nfs_expire_all_delegations(clp);
b0d3ded1a   Trond Myklebust   NFSv4: Clean up n...
88
  		} else {
d1f456b0b   Andy Adamson   NFSv4.1: Fix an N...
89
  			int ret;
b0d3ded1a   Trond Myklebust   NFSv4: Clean up n...
90
  			/* Queue an asynchronous RENEW. */
d1f456b0b   Andy Adamson   NFSv4.1: Fix an N...
91
  			ret = ops->sched_state_renewal(clp, cred, renew_flags);
a52458b48   NeilBrown   NFS/NFSD/SUNRPC: ...
92
  			put_cred(cred);
d1f456b0b   Andy Adamson   NFSv4.1: Fix an N...
93
94
95
96
97
98
99
  			switch (ret) {
  			default:
  				goto out_exp;
  			case -EAGAIN:
  			case -ENOMEM:
  				break;
  			}
58d9714a4   Trond Myklebust   NFSv4: Send RENEW...
100
  		}
dc96aef96   Alexandros Batsakis   nfs: prevent back...
101
  	} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
102
103
  		dprintk("%s: failed to call renewd. Reason: lease not expired 
  ",
3110ff804   Harvey Harrison   nfs: replace rema...
104
  				__func__);
dc96aef96   Alexandros Batsakis   nfs: prevent back...
105
106
107
  	}
  	nfs4_schedule_state_renewal(clp);
  out_exp:
b7391f44f   Trond Myklebust   NFSv4: Return unr...
108
  	nfs_expire_unreferenced_delegations(clp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
109
  out:
3110ff804   Harvey Harrison   nfs: replace rema...
110
111
  	dprintk("%s: done
  ", __func__);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
112
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113
  void
adfa6f980   David Howells   NFS: Rename struc...
114
  nfs4_schedule_state_renewal(struct nfs_client *clp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115
116
117
118
119
120
121
122
123
124
  {
  	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...
125
  			__func__, (timeout + HZ - 1) / HZ);
41f63c535   Tejun Heo   workqueue: use mo...
126
  	mod_delayed_work(system_wq, &clp->cl_renewd, timeout);
5dd3177ae   Trond Myklebust   NFSv4: Fix a use-...
127
  	set_bit(NFS_CS_RENEWD, &clp->cl_res_state);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
128
129
130
131
  	spin_unlock(&clp->cl_lock);
  }
  
  void
adfa6f980   David Howells   NFS: Rename struc...
132
  nfs4_kill_renewd(struct nfs_client *clp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133
  {
3d39c691f   Trond Myklebust   NFS: Replace flus...
134
  	cancel_delayed_work_sync(&clp->cl_renewd);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
135
  }
fb10fb67a   Trond Myklebust   NFSv4: Cleanup th...
136
137
138
139
140
  /**
   * nfs4_set_lease_period - Sets the lease period on a nfs_client
   *
   * @clp: pointer to nfs_client
   * @lease: new value for lease period
fb10fb67a   Trond Myklebust   NFSv4: Cleanup th...
141
142
   */
  void nfs4_set_lease_period(struct nfs_client *clp,
7dc2993a9   Robert Milkowski   NFSv4.0: nfs4_do_...
143
  		unsigned long lease)
fb10fb67a   Trond Myklebust   NFSv4: Cleanup th...
144
145
146
  {
  	spin_lock(&clp->cl_lock);
  	clp->cl_lease_time = lease;
fb10fb67a   Trond Myklebust   NFSv4: Cleanup th...
147
  	spin_unlock(&clp->cl_lock);
8d480326c   Trond Myklebust   NFSv4: Cap the tr...
148
149
  
  	/* Cap maximum reconnect timeout at 1/2 lease period */
26ae102f2   Trond Myklebust   NFSv4: Set the co...
150
  	rpc_set_connect_timeout(clp->cl_rpcclient, lease, lease >> 1);
fb10fb67a   Trond Myklebust   NFSv4: Cleanup th...
151
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
152
153
154
155
156
  /*
   * Local variables:
   *   c-basic-offset: 8
   * End:
   */