diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-05-27 13:02:53 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-05-27 14:33:07 -0400 |
commit | 9f594791dd530c2dc06953fb32505a26cc28371f (patch) | |
tree | 3e981af095a51a354bb1c1d281136e1889a125c9 /fs | |
parent | 7c5d7256845e30d295de4d72d4c52943bff7d1ac (diff) |
NFSv4.1: Handle other occurrences of NFS4ERR_CONN_NOT_BOUND_TO_SESSION
Let nfs4_schedule_session_recovery() handle the details of choosing
between resetting the session, and other session related recovery.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfs/nfs4_fs.h | 4 | ||||
-rw-r--r-- | fs/nfs/nfs4filelayout.c | 2 | ||||
-rw-r--r-- | fs/nfs/nfs4proc.c | 8 | ||||
-rw-r--r-- | fs/nfs/nfs4state.c | 10 |
4 files changed, 15 insertions, 9 deletions
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h index b20b5164f70a..c6827f93ab57 100644 --- a/fs/nfs/nfs4_fs.h +++ b/fs/nfs/nfs4_fs.h | |||
@@ -313,9 +313,9 @@ struct rpc_cred *nfs4_get_renew_cred_locked(struct nfs_client *clp); | |||
313 | #if defined(CONFIG_NFS_V4_1) | 313 | #if defined(CONFIG_NFS_V4_1) |
314 | struct rpc_cred *nfs4_get_machine_cred_locked(struct nfs_client *clp); | 314 | struct rpc_cred *nfs4_get_machine_cred_locked(struct nfs_client *clp); |
315 | struct rpc_cred *nfs4_get_exchange_id_cred(struct nfs_client *clp); | 315 | struct rpc_cred *nfs4_get_exchange_id_cred(struct nfs_client *clp); |
316 | extern void nfs4_schedule_session_recovery(struct nfs4_session *); | 316 | extern void nfs4_schedule_session_recovery(struct nfs4_session *, int); |
317 | #else | 317 | #else |
318 | static inline void nfs4_schedule_session_recovery(struct nfs4_session *session) | 318 | static inline void nfs4_schedule_session_recovery(struct nfs4_session *session, int err) |
319 | { | 319 | { |
320 | } | 320 | } |
321 | #endif /* CONFIG_NFS_V4_1 */ | 321 | #endif /* CONFIG_NFS_V4_1 */ |
diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c index ddea4d3f598e..e1340293872c 100644 --- a/fs/nfs/nfs4filelayout.c +++ b/fs/nfs/nfs4filelayout.c | |||
@@ -165,7 +165,7 @@ static int filelayout_async_handle_error(struct rpc_task *task, | |||
165 | dprintk("%s ERROR %d, Reset session. Exchangeid " | 165 | dprintk("%s ERROR %d, Reset session. Exchangeid " |
166 | "flags 0x%x\n", __func__, task->tk_status, | 166 | "flags 0x%x\n", __func__, task->tk_status, |
167 | clp->cl_exchange_flags); | 167 | clp->cl_exchange_flags); |
168 | nfs4_schedule_session_recovery(clp->cl_session); | 168 | nfs4_schedule_session_recovery(clp->cl_session, task->tk_status); |
169 | break; | 169 | break; |
170 | case -NFS4ERR_DELAY: | 170 | case -NFS4ERR_DELAY: |
171 | case -NFS4ERR_GRACE: | 171 | case -NFS4ERR_GRACE: |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 9f0a96fe6212..6be5fa3d8ddc 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -306,7 +306,7 @@ static int nfs4_handle_exception(struct nfs_server *server, int errorcode, struc | |||
306 | case -NFS4ERR_SEQ_MISORDERED: | 306 | case -NFS4ERR_SEQ_MISORDERED: |
307 | dprintk("%s ERROR: %d Reset session\n", __func__, | 307 | dprintk("%s ERROR: %d Reset session\n", __func__, |
308 | errorcode); | 308 | errorcode); |
309 | nfs4_schedule_session_recovery(clp->cl_session); | 309 | nfs4_schedule_session_recovery(clp->cl_session, errorcode); |
310 | exception->retry = 1; | 310 | exception->retry = 1; |
311 | break; | 311 | break; |
312 | #endif /* defined(CONFIG_NFS_V4_1) */ | 312 | #endif /* defined(CONFIG_NFS_V4_1) */ |
@@ -1330,7 +1330,7 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state | |||
1330 | case -NFS4ERR_BAD_HIGH_SLOT: | 1330 | case -NFS4ERR_BAD_HIGH_SLOT: |
1331 | case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: | 1331 | case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: |
1332 | case -NFS4ERR_DEADSESSION: | 1332 | case -NFS4ERR_DEADSESSION: |
1333 | nfs4_schedule_session_recovery(server->nfs_client->cl_session); | 1333 | nfs4_schedule_session_recovery(server->nfs_client->cl_session, err); |
1334 | goto out; | 1334 | goto out; |
1335 | case -NFS4ERR_STALE_CLIENTID: | 1335 | case -NFS4ERR_STALE_CLIENTID: |
1336 | case -NFS4ERR_STALE_STATEID: | 1336 | case -NFS4ERR_STALE_STATEID: |
@@ -3906,7 +3906,7 @@ nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server, | |||
3906 | case -NFS4ERR_SEQ_MISORDERED: | 3906 | case -NFS4ERR_SEQ_MISORDERED: |
3907 | dprintk("%s ERROR %d, Reset session\n", __func__, | 3907 | dprintk("%s ERROR %d, Reset session\n", __func__, |
3908 | task->tk_status); | 3908 | task->tk_status); |
3909 | nfs4_schedule_session_recovery(clp->cl_session); | 3909 | nfs4_schedule_session_recovery(clp->cl_session, task->tk_status); |
3910 | task->tk_status = 0; | 3910 | task->tk_status = 0; |
3911 | return -EAGAIN; | 3911 | return -EAGAIN; |
3912 | #endif /* CONFIG_NFS_V4_1 */ | 3912 | #endif /* CONFIG_NFS_V4_1 */ |
@@ -4847,7 +4847,7 @@ int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl) | |||
4847 | case -NFS4ERR_BAD_HIGH_SLOT: | 4847 | case -NFS4ERR_BAD_HIGH_SLOT: |
4848 | case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: | 4848 | case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: |
4849 | case -NFS4ERR_DEADSESSION: | 4849 | case -NFS4ERR_DEADSESSION: |
4850 | nfs4_schedule_session_recovery(server->nfs_client->cl_session); | 4850 | nfs4_schedule_session_recovery(server->nfs_client->cl_session, err); |
4851 | goto out; | 4851 | goto out; |
4852 | case -ERESTARTSYS: | 4852 | case -ERESTARTSYS: |
4853 | /* | 4853 | /* |
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index e593ae972567..d46a905b07ae 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c | |||
@@ -1635,11 +1635,17 @@ static int nfs4_reclaim_lease(struct nfs_client *clp) | |||
1635 | } | 1635 | } |
1636 | 1636 | ||
1637 | #ifdef CONFIG_NFS_V4_1 | 1637 | #ifdef CONFIG_NFS_V4_1 |
1638 | void nfs4_schedule_session_recovery(struct nfs4_session *session) | 1638 | void nfs4_schedule_session_recovery(struct nfs4_session *session, int err) |
1639 | { | 1639 | { |
1640 | struct nfs_client *clp = session->clp; | 1640 | struct nfs_client *clp = session->clp; |
1641 | 1641 | ||
1642 | set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state); | 1642 | switch (err) { |
1643 | default: | ||
1644 | set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state); | ||
1645 | break; | ||
1646 | case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: | ||
1647 | set_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state); | ||
1648 | } | ||
1643 | nfs4_schedule_lease_recovery(clp); | 1649 | nfs4_schedule_lease_recovery(clp); |
1644 | } | 1650 | } |
1645 | EXPORT_SYMBOL_GPL(nfs4_schedule_session_recovery); | 1651 | EXPORT_SYMBOL_GPL(nfs4_schedule_session_recovery); |