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);