nfs4: Do not increment open owner sequence number when reusing lock owner

This commit is contained in:
Pawel Dziepak
2013-01-08 05:52:12 +01:00
parent e4cd963ff1
commit b8982d12b7
4 changed files with 14 additions and 7 deletions
@@ -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);