aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs4state.c
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2012-03-10 11:23:15 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-03-10 11:54:36 -0500
commitad1e3968292e3af1c49ccbd0fb7d2674010f8efc (patch)
tree5eee458017d2deeff73c27740d1bddd742a05990 /fs/nfs/nfs4state.c
parent4fc8796d23819da814ec25b7793bde8f104f1a2a (diff)
NFSv4.0: Re-establish the callback channel on NFS4ERR_CB_PATHDOWN
When the NFSv4.0 server tells us that it can no-longer talk to us on the callback channel, we should attempt a new SETCLIENTID in order to re-transmit the callback channel information. Note that as long as we do not change the boot verifier, this is a safe procedure; the server is required to keep our state. Also move the function nfs_handle_cb_pathdown to fs/nfs/nfs4state.c, and change the name in order to mark it as being specific to NFSv4.0. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/nfs4state.c')
-rw-r--r--fs/nfs/nfs4state.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index de44804d9864..5fa43cd9bfc5 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -1097,9 +1097,23 @@ void nfs4_schedule_lease_recovery(struct nfs_client *clp)
1097} 1097}
1098EXPORT_SYMBOL_GPL(nfs4_schedule_lease_recovery); 1098EXPORT_SYMBOL_GPL(nfs4_schedule_lease_recovery);
1099 1099
1100/*
1101 * nfs40_handle_cb_pathdown - return all delegations after NFS4ERR_CB_PATH_DOWN
1102 * @clp: client to process
1103 *
1104 * Set the NFS4CLNT_LEASE_EXPIRED state in order to force a
1105 * resend of the SETCLIENTID and hence re-establish the
1106 * callback channel. Then return all existing delegations.
1107 */
1108static void nfs40_handle_cb_pathdown(struct nfs_client *clp)
1109{
1110 set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
1111 nfs_expire_all_delegations(clp);
1112}
1113
1100void nfs4_schedule_path_down_recovery(struct nfs_client *clp) 1114void nfs4_schedule_path_down_recovery(struct nfs_client *clp)
1101{ 1115{
1102 nfs_handle_cb_pathdown(clp); 1116 nfs40_handle_cb_pathdown(clp);
1103 nfs4_schedule_state_manager(clp); 1117 nfs4_schedule_state_manager(clp);
1104} 1118}
1105 1119
@@ -1444,7 +1458,7 @@ static int nfs4_recovery_handle_error(struct nfs_client *clp, int error)
1444 case 0: 1458 case 0:
1445 break; 1459 break;
1446 case -NFS4ERR_CB_PATH_DOWN: 1460 case -NFS4ERR_CB_PATH_DOWN:
1447 nfs_handle_cb_pathdown(clp); 1461 nfs40_handle_cb_pathdown(clp);
1448 break; 1462 break;
1449 case -NFS4ERR_NO_GRACE: 1463 case -NFS4ERR_NO_GRACE:
1450 nfs4_state_end_reclaim_reboot(clp); 1464 nfs4_state_end_reclaim_reboot(clp);