diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2013-10-17 14:13:53 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2013-10-28 15:30:52 -0400 |
commit | f8aba1e8d509c0db7a82893e595a7743ce07ea83 (patch) | |
tree | 1835096beac6cb5deb379a570015c91505938e29 /fs/nfs/nfs4proc.c | |
parent | 60ea68129942dc36cd1a3a9bdaec783369ee5a6d (diff) |
NFS: Handle NFS4ERR_LEASE_MOVED during async RENEW
With NFSv4 minor version 0, the asynchronous lease RENEW
heartbeat can return NFS4ERR_LEASE_MOVED. Error recovery logic for
async RENEW is a separate code path from the generic NFS proc paths,
so it must be updated to handle NFS4ERR_LEASE_MOVED as well.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/nfs4proc.c')
-rw-r--r-- | fs/nfs/nfs4proc.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 9f2ccf7471ee..8aa8ff3fd5e7 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -4235,7 +4235,13 @@ static void nfs4_renew_done(struct rpc_task *task, void *calldata) | |||
4235 | unsigned long timestamp = data->timestamp; | 4235 | unsigned long timestamp = data->timestamp; |
4236 | 4236 | ||
4237 | trace_nfs4_renew_async(clp, task->tk_status); | 4237 | trace_nfs4_renew_async(clp, task->tk_status); |
4238 | if (task->tk_status < 0) { | 4238 | switch (task->tk_status) { |
4239 | case 0: | ||
4240 | break; | ||
4241 | case -NFS4ERR_LEASE_MOVED: | ||
4242 | nfs4_schedule_lease_moved_recovery(clp); | ||
4243 | break; | ||
4244 | default: | ||
4239 | /* Unless we're shutting down, schedule state recovery! */ | 4245 | /* Unless we're shutting down, schedule state recovery! */ |
4240 | if (test_bit(NFS_CS_RENEWD, &clp->cl_res_state) == 0) | 4246 | if (test_bit(NFS_CS_RENEWD, &clp->cl_res_state) == 0) |
4241 | return; | 4247 | return; |