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(); RequestBuilder& req = request.Builder();
req.PutFH(fInfo.fHandle); req.PutFH(fInfo.fHandle);
req.Lock(cookie->fOpenState, lockInfo, sequence); req.Lock(cookie->fOpenState, lockInfo, &sequence);
status_t result = request.Send(); status_t result = request.Send();
if (result != B_OK) { if (result != B_OK) {
@@ -231,26 +231,32 @@ OpenState::_ReclaimLocks(uint64 newClientID)
linfo->fOwner->fClientId = newClientID; linfo->fOwner->fClientId = newClientID;
} }
uint32 sequence = fFileSystem->OpenOwnerSequenceLock();
do { do {
RPC::Server* server = fFileSystem->Server(); RPC::Server* server = fFileSystem->Server();
Request request(server, fFileSystem); Request request(server, fFileSystem);
RequestBuilder& req = request.Builder(); RequestBuilder& req = request.Builder();
req.PutFH(fInfo.fHandle); req.PutFH(fInfo.fHandle);
req.Lock(this, linfo, true); req.Lock(this, linfo, &sequence, true);
status_t result = request.Send(); status_t result = request.Send();
if (result != B_OK) if (result != B_OK) {
fFileSystem->OpenOwnerSequenceUnlock(sequence);
break; break;
}
ReplyInterpreter& reply = request.Reply(); ReplyInterpreter& reply = request.Reply();
if (HandleErrors(reply.NFS4Error(), server)) sequence += IncrementSequence(reply.NFS4Error());
if (HandleErrors(reply.NFS4Error(), server, NULL, NULL, &sequence))
continue; continue;
reply.PutFH(); reply.PutFH();
reply.Lock(linfo); reply.Lock(linfo);
fFileSystem->OpenOwnerSequenceUnlock(sequence);
break; break;
} while (true); } while (true);
locker.Unlock(); locker.Unlock();
@@ -205,7 +205,7 @@ RequestBuilder::_GenerateLockOwner(XDR::WriteStream& stream,
status_t status_t
RequestBuilder::Lock(OpenState* state, LockInfo* lock, uint32 sequence, RequestBuilder::Lock(OpenState* state, LockInfo* lock, uint32* sequence,
bool reclaim) bool reclaim)
{ {
if (fProcedure != ProcCompound) if (fProcedure != ProcCompound)
@@ -227,7 +227,7 @@ RequestBuilder::Lock(OpenState* state, LockInfo* lock, uint32 sequence,
fRequest->Stream().AddBoolean(true); // new lock owner fRequest->Stream().AddBoolean(true); // new lock owner
// open seq stateid // open seq stateid
fRequest->Stream().AddUInt(sequence); fRequest->Stream().AddUInt(*sequence);
fRequest->Stream().AddUInt(state->fStateSeq); fRequest->Stream().AddUInt(state->fStateSeq);
fRequest->Stream().AddUInt(state->fStateID[0]); fRequest->Stream().AddUInt(state->fStateID[0]);
fRequest->Stream().AddUInt(state->fStateID[1]); fRequest->Stream().AddUInt(state->fStateID[1]);
@@ -239,6 +239,7 @@ RequestBuilder::Lock(OpenState* state, LockInfo* lock, uint32 sequence,
} else { } else {
fRequest->Stream().AddBoolean(false); // old lock owner fRequest->Stream().AddBoolean(false); // old lock owner
(*sequence)--;
// lock stateid seq // lock stateid seq
fRequest->Stream().AddUInt(lock->fOwner->fStateSeq); fRequest->Stream().AddUInt(lock->fOwner->fStateSeq);
@@ -42,7 +42,7 @@ public:
status_t GetFH(); status_t GetFH();
status_t Link(const char* name); status_t Link(const char* name);
status_t Lock(OpenState* state, LockInfo* lock, status_t Lock(OpenState* state, LockInfo* lock,
uint32 sequence, bool reclaim = false); uint32* sequence, bool reclaim = false);
status_t LockT(LockType type, uint64 pos, status_t LockT(LockType type, uint64 pos,
uint64 len, OpenState* state); uint64 len, OpenState* state);
status_t LockU(LockInfo* lock); status_t LockU(LockInfo* lock);