diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-05-25 15:00:06 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-05-25 16:17:42 -0400 |
commit | 89a217360ef4e96eb83758cb9647f1c42581b097 (patch) | |
tree | a802dbd6fdca71da10b7f5983215f83a4fadeb2b /fs/nfs | |
parent | be0bfed002e0c64a91dacc42a4dab6e883e6bc7e (diff) |
NFSv4.1: Handle NFS4ERR_SEQ_MISORDERED when confirming the lease
Apparently the patch "NFS: Always use the same SETCLIENTID boot verifier"
is tickling a Linux nfs server bug, and causing a regression: the server
can get into a situation where it keeps replying NFS4ERR_SEQ_MISORDERED
to our CREATE_SESSION request even when we are sending the correct
sequence ID.
Fix this by purging the lease and then retrying.
Reported-by: Bryan Schumaker <bjschuma@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r-- | fs/nfs/nfs4state.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index 604c6009d1ac..419f8c44429e 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c | |||
@@ -1580,6 +1580,11 @@ out: | |||
1580 | static int nfs4_handle_reclaim_lease_error(struct nfs_client *clp, int status) | 1580 | static int nfs4_handle_reclaim_lease_error(struct nfs_client *clp, int status) |
1581 | { | 1581 | { |
1582 | switch (status) { | 1582 | switch (status) { |
1583 | case -NFS4ERR_SEQ_MISORDERED: | ||
1584 | if (test_and_set_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state)) | ||
1585 | return -ESERVERFAULT; | ||
1586 | /* Lease confirmation error: retry after purging the lease */ | ||
1587 | ssleep(1); | ||
1583 | case -NFS4ERR_CLID_INUSE: | 1588 | case -NFS4ERR_CLID_INUSE: |
1584 | case -NFS4ERR_STALE_CLIENTID: | 1589 | case -NFS4ERR_STALE_CLIENTID: |
1585 | clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); | 1590 | clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); |