nfs4: Do not increment open owner sequence number when reusing lock owner
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user