diff options
Diffstat (limited to 'fs/nfs/nfs4renewd.c')
| -rw-r--r-- | fs/nfs/nfs4renewd.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/fs/nfs/nfs4renewd.c b/fs/nfs/nfs4renewd.c index a3001628ad32..5d764d8e6d8a 100644 --- a/fs/nfs/nfs4renewd.c +++ b/fs/nfs/nfs4renewd.c | |||
| @@ -54,6 +54,7 @@ | |||
| 54 | #include <linux/nfs4.h> | 54 | #include <linux/nfs4.h> |
| 55 | #include <linux/nfs_fs.h> | 55 | #include <linux/nfs_fs.h> |
| 56 | #include "nfs4_fs.h" | 56 | #include "nfs4_fs.h" |
| 57 | #include "delegation.h" | ||
| 57 | 58 | ||
| 58 | #define NFSDBG_FACILITY NFSDBG_PROC | 59 | #define NFSDBG_FACILITY NFSDBG_PROC |
| 59 | 60 | ||
| @@ -61,6 +62,7 @@ void | |||
| 61 | nfs4_renew_state(void *data) | 62 | nfs4_renew_state(void *data) |
| 62 | { | 63 | { |
| 63 | struct nfs4_client *clp = (struct nfs4_client *)data; | 64 | struct nfs4_client *clp = (struct nfs4_client *)data; |
| 65 | struct rpc_cred *cred; | ||
| 64 | long lease, timeout; | 66 | long lease, timeout; |
| 65 | unsigned long last, now; | 67 | unsigned long last, now; |
| 66 | 68 | ||
| @@ -68,7 +70,7 @@ nfs4_renew_state(void *data) | |||
| 68 | dprintk("%s: start\n", __FUNCTION__); | 70 | dprintk("%s: start\n", __FUNCTION__); |
| 69 | /* Are there any active superblocks? */ | 71 | /* Are there any active superblocks? */ |
| 70 | if (list_empty(&clp->cl_superblocks)) | 72 | if (list_empty(&clp->cl_superblocks)) |
| 71 | goto out; | 73 | goto out; |
| 72 | spin_lock(&clp->cl_lock); | 74 | spin_lock(&clp->cl_lock); |
| 73 | lease = clp->cl_lease_time; | 75 | lease = clp->cl_lease_time; |
| 74 | last = clp->cl_last_renewal; | 76 | last = clp->cl_last_renewal; |
| @@ -76,9 +78,17 @@ nfs4_renew_state(void *data) | |||
| 76 | timeout = (2 * lease) / 3 + (long)last - (long)now; | 78 | timeout = (2 * lease) / 3 + (long)last - (long)now; |
| 77 | /* Are we close to a lease timeout? */ | 79 | /* Are we close to a lease timeout? */ |
| 78 | if (time_after(now, last + lease/3)) { | 80 | if (time_after(now, last + lease/3)) { |
| 81 | cred = nfs4_get_renew_cred(clp); | ||
| 82 | if (cred == NULL) { | ||
| 83 | set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); | ||
| 84 | spin_unlock(&clp->cl_lock); | ||
| 85 | nfs_expire_all_delegations(clp); | ||
| 86 | goto out; | ||
| 87 | } | ||
| 79 | spin_unlock(&clp->cl_lock); | 88 | spin_unlock(&clp->cl_lock); |
| 80 | /* Queue an asynchronous RENEW. */ | 89 | /* Queue an asynchronous RENEW. */ |
| 81 | nfs4_proc_async_renew(clp); | 90 | nfs4_proc_async_renew(clp, cred); |
| 91 | put_rpccred(cred); | ||
| 82 | timeout = (2 * lease) / 3; | 92 | timeout = (2 * lease) / 3; |
| 83 | spin_lock(&clp->cl_lock); | 93 | spin_lock(&clp->cl_lock); |
| 84 | } else | 94 | } else |
