aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2013-10-17 14:13:58 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2013-10-28 15:31:07 -0400
commitd1c2331e75d7a5a22e2910a8bd042ea90b543db1 (patch)
tree667f63683987211afce6c0840ea9cf33e2932581 /fs/nfs
parentf8aba1e8d509c0db7a82893e595a7743ce07ea83 (diff)
NFS: Handle SEQ4_STATUS_LEASE_MOVED
With the advent of NFSv4 sessions in NFSv4.1 and following, a "lease moved" condition is reported differently than it is in NFSv4.0. NFSv4 minor version 0 servers return an error status code, NFS4ERR_LEASE_MOVED, to signal that a lease has moved. This error causes the whole compound operation to fail. Normal compounds against this server continue to fail until the client performs migration recovery on the migrated share. Minor version 1 and later servers assert a bit flag in the reply to a compound's SEQUENCE operation to signal LEASE_MOVED. This is not a fatal condition: operations against this server continue normally. The server asserts this flag until the client performs migration recovery on the migrated share. Note that servers MUST NOT return NFS4ERR_LEASE_MOVED to NFSv4 clients not using NFSv4.0. After the server asserts any of the sr_status_flags in the SEQUENCE operation in a typical compound, our client initiates standard lease recovery. For NFSv4.1+, a stand-alone SEQUENCE operation is performed to discover what recovery is needed. If SEQ4_STATUS_LEASE_MOVED is asserted in this stand-alone SEQUENCE operation, our client attempts to discover which FSIDs have been migrated, and then performs migration recovery on each. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/nfs4state.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index 552706d2d776..62c08bf60e65 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -2227,9 +2227,10 @@ void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags)
2227 nfs41_handle_server_reboot(clp); 2227 nfs41_handle_server_reboot(clp);
2228 if (flags & (SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED | 2228 if (flags & (SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED |
2229 SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED | 2229 SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED |
2230 SEQ4_STATUS_ADMIN_STATE_REVOKED | 2230 SEQ4_STATUS_ADMIN_STATE_REVOKED))
2231 SEQ4_STATUS_LEASE_MOVED))
2232 nfs41_handle_state_revoked(clp); 2231 nfs41_handle_state_revoked(clp);
2232 if (flags & SEQ4_STATUS_LEASE_MOVED)
2233 nfs4_schedule_lease_moved_recovery(clp);
2233 if (flags & SEQ4_STATUS_RECALLABLE_STATE_REVOKED) 2234 if (flags & SEQ4_STATUS_RECALLABLE_STATE_REVOKED)
2234 nfs41_handle_recallable_state_revoked(clp); 2235 nfs41_handle_recallable_state_revoked(clp);
2235 if (flags & SEQ4_STATUS_BACKCHANNEL_FAULT) 2236 if (flags & SEQ4_STATUS_BACKCHANNEL_FAULT)