From 6136b82b1e04cc9c016268154502584fd01f8a7d Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Thu, 3 Jan 2013 01:50:22 +0100 Subject: [PATCH] nfs4: Fix handling of retried CLOSE requests --- src/add-ons/kernel/file_systems/nfs4/NFS4Object.cpp | 7 ++++++- src/add-ons/kernel/file_systems/nfs4/OpenState.cpp | 8 ++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Object.cpp b/src/add-ons/kernel/file_systems/nfs4/NFS4Object.cpp index c213ab9bd9..69381930f9 100644 --- a/src/add-ons/kernel/file_systems/nfs4/NFS4Object.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/NFS4Object.cpp @@ -24,7 +24,6 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv, ASSERT(nfs4Error != NFS4ERR_CLID_INUSE); ASSERT(nfs4Error != NFS4ERR_NOFILEHANDLE); ASSERT(nfs4Error != NFS4ERR_BAD_STATEID); - ASSERT(nfs4Error != NFS4ERR_BAD_SEQID); ASSERT(nfs4Error != NFS4ERR_RESTOREFH); ASSERT(nfs4Error != NFS4ERR_LOCKS_HELD); ASSERT(nfs4Error != NFS4ERR_OP_ILLEGAL); @@ -36,6 +35,12 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv, case NFS4_OK: return false; + // retransmission of CLOSE caused seqid to fall back + case NFS4ERR_BAD_SEQID: + ASSERT(sequence != NULL); + (*sequence)++; + return true; + // server needs more time, we need to wait case NFS4ERR_LOCKED: case NFS4ERR_DELAY: diff --git a/src/add-ons/kernel/file_systems/nfs4/OpenState.cpp b/src/add-ons/kernel/file_systems/nfs4/OpenState.cpp index f83d656fab..446503de6a 100644 --- a/src/add-ons/kernel/file_systems/nfs4/OpenState.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/OpenState.cpp @@ -290,6 +290,14 @@ OpenState::Close() sequence += IncrementSequence(reply.NFS4Error()); + // RFC 3530 8.10.1. Some servers does not do anything to help client + // recognize retried CLOSE requests so we just assume that BAD_STATEID + // on CLOSE request is just a result of retransmission. + if (reply.NFS4Error() == NFS4ERR_BAD_STATEID) { + fFileSystem->OpenOwnerSequenceUnlock(sequence); + return B_OK; + } + if (HandleErrors(reply.NFS4Error(), serv, NULL, this, &sequence)) continue; fFileSystem->OpenOwnerSequenceUnlock(sequence);