summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan Schumaker <bjschuma@netapp.com>2012-10-30 16:06:35 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-11-26 11:34:56 -0800
commit31fcdd0d4e11b4fe065277932ab7e3fe60a9ed6e (patch)
tree2b8e2bb966bcf6d91b82aecb798612ba9b45d682
parentc76fbefaf9e4505a3d9024be2643cbb2f95e3c83 (diff)
downloadkernel-common-31fcdd0d4e11b4fe065277932ab7e3fe60a9ed6e.tar.gz
kernel-common-31fcdd0d4e11b4fe065277932ab7e3fe60a9ed6e.tar.bz2
kernel-common-31fcdd0d4e11b4fe065277932ab7e3fe60a9ed6e.zip
NFS: Wait for session recovery to finish before returning
commit 399f11c3d872bd748e1575574de265a6304c7c43 upstream. Currently, we will schedule session recovery and then return to the caller of nfs4_handle_exception. This works for most cases, but causes a hang on the following test case: Client Server ------ ------ Open file over NFS v4.1 Write to file Expire client Try to lock file The server will return NFS4ERR_BADSESSION, prompting the client to schedule recovery. However, the client will continue placing lock attempts and the open recovery never seems to be scheduled. The simplest solution is to wait for session recovery to run before retrying the lock. Signed-off-by: Bryan Schumaker <bjschuma@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> [bwh: Backported to 3.2: adjust context] Signed-off-by: Ben Hutchings <ben@decadent.org.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--fs/nfs/nfs4proc.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index d5d540016de4..3720caa617e7 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -300,8 +300,7 @@ static int nfs4_handle_exception(struct nfs_server *server, int errorcode, struc
dprintk("%s ERROR: %d Reset session\n", __func__,
errorcode);
nfs4_schedule_session_recovery(clp->cl_session);
- exception->retry = 1;
- break;
+ goto wait_on_recovery;
#endif /* defined(CONFIG_NFS_V4_1) */
case -NFS4ERR_FILE_OPEN:
if (exception->timeout > HZ) {