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
39
40
41
42
43
44
45
46#include <linux/mm.h>
47#include <linux/pagemap.h>
48#include <linux/sunrpc/sched.h>
49#include <linux/sunrpc/clnt.h>
50
51#include <linux/nfs.h>
52#include <linux/nfs4.h>
53#include <linux/nfs_fs.h>
54#include "nfs4_fs.h"
55#include "delegation.h"
56
57#define NFSDBG_FACILITY NFSDBG_PROC
58
59void
60nfs4_renew_state(struct work_struct *work)
61{
62 struct nfs_client *clp =
63 container_of(work, struct nfs_client, cl_renewd.work);
64 struct rpc_cred *cred;
65 long lease, timeout;
66 unsigned long last, now;
67
68 down_read(&clp->cl_sem);
69 dprintk("%s: start\n", __func__);
70
71 if (list_empty(&clp->cl_superblocks))
72 goto out;
73 spin_lock(&clp->cl_lock);
74 lease = clp->cl_lease_time;
75 last = clp->cl_last_renewal;
76 now = jiffies;
77 timeout = (2 * lease) / 3 + (long)last - (long)now;
78
79 if (time_after(now, last + lease/3)) {
80 cred = nfs4_get_renew_cred(clp);
81 if (cred == NULL) {
82 set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
83 spin_unlock(&clp->cl_lock);
84 nfs_expire_all_delegations(clp);
85 goto out;
86 }
87 spin_unlock(&clp->cl_lock);
88
89 nfs4_proc_async_renew(clp, cred);
90 put_rpccred(cred);
91 timeout = (2 * lease) / 3;
92 spin_lock(&clp->cl_lock);
93 } else
94 dprintk("%s: failed to call renewd. Reason: lease not expired \n",
95 __func__);
96 if (timeout < 5 * HZ)
97 timeout = 5 * HZ;
98 dprintk("%s: requeueing work. Lease period = %ld\n",
99 __func__, (timeout + HZ - 1) / HZ);
100 cancel_delayed_work(&clp->cl_renewd);
101 schedule_delayed_work(&clp->cl_renewd, timeout);
102 spin_unlock(&clp->cl_lock);
103out:
104 up_read(&clp->cl_sem);
105 dprintk("%s: done\n", __func__);
106}
107
108
109void
110nfs4_schedule_state_renewal(struct nfs_client *clp)
111{
112 long timeout;
113
114 spin_lock(&clp->cl_lock);
115 timeout = (2 * clp->cl_lease_time) / 3 + (long)clp->cl_last_renewal
116 - (long)jiffies;
117 if (timeout < 5 * HZ)
118 timeout = 5 * HZ;
119 dprintk("%s: requeueing work. Lease period = %ld\n",
120 __func__, (timeout + HZ - 1) / HZ);
121 cancel_delayed_work(&clp->cl_renewd);
122 schedule_delayed_work(&clp->cl_renewd, timeout);
123 set_bit(NFS_CS_RENEWD, &clp->cl_res_state);
124 spin_unlock(&clp->cl_lock);
125}
126
127void
128nfs4_renewd_prepare_shutdown(struct nfs_server *server)
129{
130 cancel_delayed_work(&server->nfs_client->cl_renewd);
131}
132
133void
134nfs4_kill_renewd(struct nfs_client *clp)
135{
136 cancel_delayed_work_sync(&clp->cl_renewd);
137}
138
139
140
141
142
143
144