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();
|
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user