summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBryan Schumaker2012-09-26 21:25:52 +0200
committerTrond Myklebust2012-10-02 00:17:25 +0200
commit6938867edba929a65a167a97581231e76aeb10b4 (patch)
tree9f1fcee1c9dc22515d335c69db0f01e5eb9f4bb1
parentNFS: Always use the open stateid when checking for expired opens (diff)
downloadkernel-qcow2-linux-6938867edba929a65a167a97581231e76aeb10b4.tar.gz
kernel-qcow2-linux-6938867edba929a65a167a97581231e76aeb10b4.tar.xz
kernel-qcow2-linux-6938867edba929a65a167a97581231e76aeb10b4.zip
NFS: Remove bad delegations during open recovery
I put the client into an open recovery loop by: Client: Open file read half Server: Expire client (echo 0 > /sys/kernel/debug/nfsd/forget_clients) Client: Drop vm cache (echo 3 > /proc/sys/vm/drop_caches) finish reading file This causes a loop because the client never updates the nfs4_state after discovering that the delegation is invalid. This means it will keep trying to read using the bad delegation rather than attempting to re-open the file. Signed-off-by: Bryan Schumaker <bjschuma@netapp.com> CC: stable@vger.kernel.org [3.4+] Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r--fs/nfs/nfs4proc.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 755ee162ee7e..471a75f11ea2 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -1774,7 +1774,11 @@ static void nfs41_clear_delegation_stateid(struct nfs4_state *state)
* informs us the stateid is unrecognized. */
if (status != -NFS4ERR_BAD_STATEID)
nfs41_free_stateid(server, stateid);
+ nfs_remove_bad_delegation(state->inode);
+ write_seqlock(&state->seqlock);
+ nfs4_stateid_copy(&state->stateid, &state->open_stateid);
+ write_sequnlock(&state->seqlock);
clear_bit(NFS_DELEGATED_STATE, &state->flags);
}
}