nfs4: Fix OPEN and CLOSE sequence numbers

This commit is contained in:
Pawel Dziepak
2012-06-29 02:14:52 +02:00
parent 941416ff8b
commit 5a451a5405
6 changed files with 30 additions and 42 deletions
+10 -9
View File
@@ -15,6 +15,9 @@
#include "Request.h" #include "Request.h"
vint64 OpenFileCookie::fLastOwnerId = 0;
Inode::Inode() Inode::Inode()
{ {
} }
@@ -395,6 +398,7 @@ Inode::Open(int mode, OpenFileCookie* cookie)
cookie->fHandle = fHandle; cookie->fHandle = fHandle;
cookie->fMode = mode; cookie->fMode = mode;
cookie->fSequence = 0;
do { do {
cookie->fClientId = fFilesystem->NFSServer()->ClientId(); cookie->fClientId = fFilesystem->NFSServer()->ClientId();
@@ -402,13 +406,11 @@ Inode::Open(int mode, OpenFileCookie* cookie)
Request request(fFilesystem->Server()); Request request(fFilesystem->Server());
RequestBuilder& req = request.Builder(); RequestBuilder& req = request.Builder();
cookie->fOwnerTime = time(NULL); cookie->fOwnerId = atomic_add64(&cookie->fLastOwnerId, 1);
cookie->fOwnerTID = find_thread(NULL);
req.PutFH(fParentFH); req.PutFH(fParentFH);
req.Open(CLAIM_NULL, fFilesystem->NFSServer()->SequenceId(), req.Open(CLAIM_NULL, cookie->fSequence++, OPEN4_SHARE_ACCESS_READ,
OPEN4_SHARE_ACCESS_READ, cookie->fClientId, OPEN4_NOCREATE, cookie->fClientId, OPEN4_NOCREATE, cookie->fOwnerId, fName);
cookie->fOwnerTime, cookie->fOwnerTID, fName);
result = request.Send(); result = request.Send();
if (result != B_OK) if (result != B_OK)
@@ -434,7 +436,6 @@ Inode::Open(int mode, OpenFileCookie* cookie)
if (result != B_OK) if (result != B_OK)
return result; return result;
result = reply.Open(cookie->fStateId, &cookie->fStateSeq, &confirm); result = reply.Open(cookie->fStateId, &cookie->fStateSeq, &confirm);
if (result != B_OK) if (result != B_OK)
return result; return result;
@@ -450,8 +451,8 @@ Inode::Open(int mode, OpenFileCookie* cookie)
RequestBuilder& req = request.Builder(); RequestBuilder& req = request.Builder();
req.PutFH(fHandle); req.PutFH(fHandle);
req.OpenConfirm(fFilesystem->NFSServer()->SequenceId(), req.OpenConfirm(cookie->fSequence++, cookie->fStateId,
cookie->fStateId, cookie->fStateSeq); cookie->fStateSeq);
result = request.Send(); result = request.Send();
if (result != B_OK) { if (result != B_OK) {
@@ -488,7 +489,7 @@ Inode::Close(OpenFileCookie* cookie)
RequestBuilder& req = request.Builder(); RequestBuilder& req = request.Builder();
req.PutFH(fHandle); req.PutFH(fHandle);
req.Close(fFilesystem->NFSServer()->SequenceId(), cookie->fStateId, req.Close(cookie->fSequence++, cookie->fStateId,
cookie->fStateSeq); cookie->fStateSeq);
status_t result = request.Send(); status_t result = request.Send();
+11 -9
View File
@@ -19,19 +19,21 @@
struct OpenFileCookie { struct OpenFileCookie {
uint64 fClientId; uint64 fClientId;
uint32 fMode; uint32 fMode;
Filehandle fHandle; Filehandle fHandle;
uint32 fStateId[3]; uint32 fStateId[3];
uint32 fStateSeq; uint32 fStateSeq;
uint32 fOwnerTime; uint32 fSequence;
uint32 fOwnerTID;
OpenFileCookie* fNext; uint64 fOwnerId;
OpenFileCookie* fPrev; static vint64 fLastOwnerId;
OpenFileCookie* fNext;
OpenFileCookie* fPrev;
}; };
class Inode { class Inode {
@@ -17,7 +17,6 @@ NFS4Server::NFS4Server(RPC::Server* serv)
fThreadCancel(true), fThreadCancel(true),
fLeaseTime(0), fLeaseTime(0),
fCIDUseCount(0), fCIDUseCount(0),
fSequenceId(0),
fOpenFiles(NULL), fOpenFiles(NULL),
fServer(serv) fServer(serv)
{ {
@@ -72,11 +71,10 @@ NFS4Server::_ReclaimOpen(OpenFileCookie* cookie)
RequestBuilder& req = request.Builder(); RequestBuilder& req = request.Builder();
req.PutFH(cookie->fHandle); req.PutFH(cookie->fHandle);
req.Open(CLAIM_PREVIOUS, SequenceId(), OPEN4_SHARE_ACCESS_READ, req.Open(CLAIM_PREVIOUS, cookie->fSequence++, OPEN4_SHARE_ACCESS_READ,
cookie->fClientId, OPEN4_NOCREATE, cookie->fOwnerTime, cookie->fClientId, OPEN4_NOCREATE, cookie->fOwnerId, NULL);
cookie->fOwnerTID, NULL);
status_t result = request.Send(); status_t result = request.Send();;
if (result != B_OK) if (result != B_OK)
return result; return result;
@@ -95,7 +93,8 @@ NFS4Server::_ReclaimOpen(OpenFileCookie* cookie)
request.Reset(); request.Reset();
req.PutFH(cookie->fHandle); req.PutFH(cookie->fHandle);
req.OpenConfirm(SequenceId(), cookie->fStateId, cookie->fStateSeq); req.OpenConfirm(cookie->fSequence++, cookie->fStateId,
cookie->fStateSeq);
result = request.Send(); result = request.Send();
if (result != B_OK) if (result != B_OK)
@@ -28,8 +28,6 @@ public:
uint64 ClientId(uint64 prevId = 0, bool forceNew = false); uint64 ClientId(uint64 prevId = 0, bool forceNew = false);
void ReleaseCID(uint64 cid); void ReleaseCID(uint64 cid);
inline uint32 SequenceId();
inline uint32 LeaseTime(); inline uint32 LeaseTime();
private: private:
status_t _ReclaimOpen(OpenFileCookie* cookie); status_t _ReclaimOpen(OpenFileCookie* cookie);
@@ -48,20 +46,12 @@ private:
uint32 fCIDUseCount; uint32 fCIDUseCount;
mutex fLock; mutex fLock;
vint32 fSequenceId;
OpenFileCookie* fOpenFiles; OpenFileCookie* fOpenFiles;
mutex fOpenLock; mutex fOpenLock;
RPC::Server* fServer; RPC::Server* fServer;
}; };
inline uint32
NFS4Server::SequenceId()
{
return static_cast<uint32>(atomic_add(&fSequenceId, 1));
}
inline uint32 inline uint32
NFS4Server::LeaseTime() NFS4Server::LeaseTime()
@@ -153,7 +153,7 @@ RequestBuilder::LookUpUp()
status_t status_t
RequestBuilder::Open(OpenClaim claim, uint32 seq, uint32 access, uint64 id, RequestBuilder::Open(OpenClaim claim, uint32 seq, uint32 access, uint64 id,
OpenCreate oc, uint32 ownerTime, uint32 ownerTID, const char* name) OpenCreate oc, uint64 ownerId, const char* name)
{ {
if (fProcedure != ProcCompound) if (fProcedure != ProcCompound)
return B_BAD_VALUE; return B_BAD_VALUE;
@@ -168,11 +168,8 @@ RequestBuilder::Open(OpenClaim claim, uint32 seq, uint32 access, uint64 id,
char owner[128]; char owner[128];
int pos = 0; int pos = 0;
*(uint32*)(owner + pos) = ownerTime; *(uint64*)(owner + pos) = ownerId;
pos += sizeof(uint32); pos += sizeof(uint64);
*(uint32*)(owner + pos) = ownerTID;
pos += sizeof(uint32);
fRequest->Stream().AddOpaque(owner, pos); fRequest->Stream().AddOpaque(owner, pos);
@@ -33,8 +33,7 @@ public:
status_t LookUpUp(); status_t LookUpUp();
status_t Open(OpenClaim claim, uint32 seq, status_t Open(OpenClaim claim, uint32 seq,
uint32 access, uint64 id, OpenCreate oc, uint32 access, uint64 id, OpenCreate oc,
uint32 ownerTime, uint32 ownerTID, uint64 ownerId, const char* name);
const char* name);
status_t OpenConfirm(uint32 seq, const uint32* id, status_t OpenConfirm(uint32 seq, const uint32* id,
uint32 stateSeq); uint32 stateSeq);
status_t PutFH(const Filehandle& fh); status_t PutFH(const Filehandle& fh);