diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp index 9c374c931d..6118c42175 100644 --- a/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp @@ -1105,7 +1105,7 @@ NFS4Inode::AcquireLock(OpenFileCookie* cookie, LockInfo* lockInfo, bool wait) RequestBuilder& req = request.Builder(); req.PutFH(fInfo.fHandle); - req.Lock(cookie->fOpenState, lockInfo, sequence); + req.Lock(cookie->fOpenState, lockInfo, &sequence); status_t result = request.Send(); if (result != B_OK) { diff --git a/src/add-ons/kernel/file_systems/nfs4/OpenState.cpp b/src/add-ons/kernel/file_systems/nfs4/OpenState.cpp index 13e2d50342..7ae795e779 100644 --- a/src/add-ons/kernel/file_systems/nfs4/OpenState.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/OpenState.cpp @@ -231,26 +231,32 @@ OpenState::_ReclaimLocks(uint64 newClientID) linfo->fOwner->fClientId = newClientID; } + uint32 sequence = fFileSystem->OpenOwnerSequenceLock(); do { RPC::Server* server = fFileSystem->Server(); Request request(server, fFileSystem); RequestBuilder& req = request.Builder(); req.PutFH(fInfo.fHandle); - req.Lock(this, linfo, true); + req.Lock(this, linfo, &sequence, true); status_t result = request.Send(); - if (result != B_OK) + if (result != B_OK) { + fFileSystem->OpenOwnerSequenceUnlock(sequence); break; + } ReplyInterpreter& reply = request.Reply(); - if (HandleErrors(reply.NFS4Error(), server)) + sequence += IncrementSequence(reply.NFS4Error()); + + if (HandleErrors(reply.NFS4Error(), server, NULL, NULL, &sequence)) continue; reply.PutFH(); reply.Lock(linfo); + fFileSystem->OpenOwnerSequenceUnlock(sequence); break; } while (true); locker.Unlock(); diff --git a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp index 3b8f69e376..e425e63a16 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp @@ -205,7 +205,7 @@ RequestBuilder::_GenerateLockOwner(XDR::WriteStream& stream, status_t -RequestBuilder::Lock(OpenState* state, LockInfo* lock, uint32 sequence, +RequestBuilder::Lock(OpenState* state, LockInfo* lock, uint32* sequence, bool reclaim) { if (fProcedure != ProcCompound) @@ -227,7 +227,7 @@ RequestBuilder::Lock(OpenState* state, LockInfo* lock, uint32 sequence, fRequest->Stream().AddBoolean(true); // new lock owner // open seq stateid - fRequest->Stream().AddUInt(sequence); + fRequest->Stream().AddUInt(*sequence); fRequest->Stream().AddUInt(state->fStateSeq); fRequest->Stream().AddUInt(state->fStateID[0]); fRequest->Stream().AddUInt(state->fStateID[1]); @@ -239,6 +239,7 @@ RequestBuilder::Lock(OpenState* state, LockInfo* lock, uint32 sequence, } else { fRequest->Stream().AddBoolean(false); // old lock owner + (*sequence)--; // lock stateid seq fRequest->Stream().AddUInt(lock->fOwner->fStateSeq); diff --git a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h index 1b0ea90dc3..6bf75248f9 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h +++ b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h @@ -42,7 +42,7 @@ public: status_t GetFH(); status_t Link(const char* name); status_t Lock(OpenState* state, LockInfo* lock, - uint32 sequence, bool reclaim = false); + uint32* sequence, bool reclaim = false); status_t LockT(LockType type, uint64 pos, uint64 len, OpenState* state); status_t LockU(LockInfo* lock);