added 2 changesets to branch 'refs/remotes/pdziepak-github/nfs4' old head: 345a659337ba627af5d67f2064ce7a2746c28f0c new head: e8ef557a560f15c0133390e86288d17c2ad41114 overview: https://github.com/pdziepak/Haiku/compare/345a659...e8ef557 ---------------------------------------------------------------------------- 6136b82: nfs4: Fix handling of retried CLOSE requests e8ef557: nfs4: Fix double delete rpc when WaitCall fails [ Pawel Dziepak <pdziepak@xxxxxxxxxxx> ] ---------------------------------------------------------------------------- 3 files changed, 22 insertions(+), 6 deletions(-) src/add-ons/kernel/file_systems/nfs4/NFS4Object.cpp | 7 ++++++- src/add-ons/kernel/file_systems/nfs4/OpenState.cpp | 8 ++++++++ src/add-ons/kernel/file_systems/nfs4/Request.cpp | 13 ++++++++----- ############################################################################ Commit: 6136b82b1e04cc9c016268154502584fd01f8a7d Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Thu Jan 3 00:50:22 2013 UTC nfs4: Fix handling of retried CLOSE requests ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Object.cpp b/src/add-ons/kernel/file_systems/nfs4/NFS4Object.cpp index c213ab9..6938193 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 f83d656..446503d 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); ############################################################################ Commit: e8ef557a560f15c0133390e86288d17c2ad41114 Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Thu Jan 3 00:56:47 2013 UTC nfs4: Fix double delete rpc when WaitCall fails ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/Request.cpp b/src/add-ons/kernel/file_systems/nfs4/Request.cpp index 3924f3b..b4c4e43 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Request.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Request.cpp @@ -125,6 +125,9 @@ Request::_SendTCP(Cookie* cookie) } } while (result != B_OK && (hard || attempts++ < retryLimit)); + if (result != B_OK) + return result; + if (cookie != NULL) cookie->UnregisterRequest(rpc); @@ -133,11 +136,11 @@ Request::_SendTCP(Cookie* cookie) result = rpc->fError; delete rpc; return result; - } else { - fReply.SetTo(rpl); - delete rpc; - return B_OK; - }; + } + + fReply.SetTo(rpl); + delete rpc; + return B_OK; }