diff options
author | Trond Myklebust <trond.myklebust@primarydata.com> | 2014-03-18 14:11:24 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2014-03-19 08:34:20 -0400 |
commit | f9b7ebdf7e41671de7926a5951c324258200b42a (patch) | |
tree | 087fa9469a8c8d283ba46eb8cc8da1660e08ee06 /fs/nfs | |
parent | 706cb8db3b629f6021499a5edfdde526a3cf7d95 (diff) |
NFSv4: Schedule recovery if nfs40_walk_client_list() is interrupted
If a timeout or a signal interrupts the NFSv4 trunking discovery
SETCLIENTID_CONFIRM call, then we don't know whether or not the
server has changed the callback identifier on us.
Assume that it did, and schedule a 'path down' recovery...
Tested-by: Steve Dickson <steved@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r-- | fs/nfs/nfs4client.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c index 0e46d3d1b6cc..aa9ef4876046 100644 --- a/fs/nfs/nfs4client.c +++ b/fs/nfs/nfs4client.c | |||
@@ -531,6 +531,13 @@ int nfs40_walk_client_list(struct nfs_client *new, | |||
531 | *result = pos; | 531 | *result = pos; |
532 | dprintk("NFS: <-- %s using nfs_client = %p ({%d})\n", | 532 | dprintk("NFS: <-- %s using nfs_client = %p ({%d})\n", |
533 | __func__, pos, atomic_read(&pos->cl_count)); | 533 | __func__, pos, atomic_read(&pos->cl_count)); |
534 | goto out; | ||
535 | case -ERESTARTSYS: | ||
536 | case -ETIMEDOUT: | ||
537 | /* The callback path may have been inadvertently | ||
538 | * changed. Schedule recovery! | ||
539 | */ | ||
540 | nfs4_schedule_path_down_recovery(pos); | ||
534 | default: | 541 | default: |
535 | goto out; | 542 | goto out; |
536 | } | 543 | } |