diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp index 3fcaab1543..1a50bb6834 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp @@ -15,6 +15,9 @@ #include "Request.h" +vint64 OpenFileCookie::fLastOwnerId = 0; + + Inode::Inode() { } @@ -395,6 +398,7 @@ Inode::Open(int mode, OpenFileCookie* cookie) cookie->fHandle = fHandle; cookie->fMode = mode; + cookie->fSequence = 0; do { cookie->fClientId = fFilesystem->NFSServer()->ClientId(); @@ -402,13 +406,11 @@ Inode::Open(int mode, OpenFileCookie* cookie) Request request(fFilesystem->Server()); RequestBuilder& req = request.Builder(); - cookie->fOwnerTime = time(NULL); - cookie->fOwnerTID = find_thread(NULL); + cookie->fOwnerId = atomic_add64(&cookie->fLastOwnerId, 1); req.PutFH(fParentFH); - req.Open(CLAIM_NULL, fFilesystem->NFSServer()->SequenceId(), - OPEN4_SHARE_ACCESS_READ, cookie->fClientId, OPEN4_NOCREATE, - cookie->fOwnerTime, cookie->fOwnerTID, fName); + req.Open(CLAIM_NULL, cookie->fSequence++, OPEN4_SHARE_ACCESS_READ, + cookie->fClientId, OPEN4_NOCREATE, cookie->fOwnerId, fName); result = request.Send(); if (result != B_OK) @@ -434,7 +436,6 @@ Inode::Open(int mode, OpenFileCookie* cookie) if (result != B_OK) return result; - result = reply.Open(cookie->fStateId, &cookie->fStateSeq, &confirm); if (result != B_OK) return result; @@ -450,8 +451,8 @@ Inode::Open(int mode, OpenFileCookie* cookie) RequestBuilder& req = request.Builder(); req.PutFH(fHandle); - req.OpenConfirm(fFilesystem->NFSServer()->SequenceId(), - cookie->fStateId, cookie->fStateSeq); + req.OpenConfirm(cookie->fSequence++, cookie->fStateId, + cookie->fStateSeq); result = request.Send(); if (result != B_OK) { @@ -488,7 +489,7 @@ Inode::Close(OpenFileCookie* cookie) RequestBuilder& req = request.Builder(); req.PutFH(fHandle); - req.Close(fFilesystem->NFSServer()->SequenceId(), cookie->fStateId, + req.Close(cookie->fSequence++, cookie->fStateId, cookie->fStateSeq); status_t result = request.Send(); diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.h b/src/add-ons/kernel/file_systems/nfs4/Inode.h index d8c7520dda..d60873a98a 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.h +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.h @@ -19,19 +19,21 @@ struct OpenFileCookie { - uint64 fClientId; + uint64 fClientId; - uint32 fMode; + uint32 fMode; - Filehandle fHandle; - uint32 fStateId[3]; - uint32 fStateSeq; + Filehandle fHandle; + uint32 fStateId[3]; + uint32 fStateSeq; - uint32 fOwnerTime; - uint32 fOwnerTID; + uint32 fSequence; - OpenFileCookie* fNext; - OpenFileCookie* fPrev; + uint64 fOwnerId; + static vint64 fLastOwnerId; + + OpenFileCookie* fNext; + OpenFileCookie* fPrev; }; class Inode { diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp b/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp index 3eab8ab502..2a0d7b1e49 100644 --- a/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp @@ -17,7 +17,6 @@ NFS4Server::NFS4Server(RPC::Server* serv) fThreadCancel(true), fLeaseTime(0), fCIDUseCount(0), - fSequenceId(0), fOpenFiles(NULL), fServer(serv) { @@ -72,11 +71,10 @@ NFS4Server::_ReclaimOpen(OpenFileCookie* cookie) RequestBuilder& req = request.Builder(); req.PutFH(cookie->fHandle); - req.Open(CLAIM_PREVIOUS, SequenceId(), OPEN4_SHARE_ACCESS_READ, - cookie->fClientId, OPEN4_NOCREATE, cookie->fOwnerTime, - cookie->fOwnerTID, NULL); + req.Open(CLAIM_PREVIOUS, cookie->fSequence++, OPEN4_SHARE_ACCESS_READ, + cookie->fClientId, OPEN4_NOCREATE, cookie->fOwnerId, NULL); - status_t result = request.Send(); + status_t result = request.Send();; if (result != B_OK) return result; @@ -95,7 +93,8 @@ NFS4Server::_ReclaimOpen(OpenFileCookie* cookie) request.Reset(); req.PutFH(cookie->fHandle); - req.OpenConfirm(SequenceId(), cookie->fStateId, cookie->fStateSeq); + req.OpenConfirm(cookie->fSequence++, cookie->fStateId, + cookie->fStateSeq); result = request.Send(); if (result != B_OK) diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Server.h b/src/add-ons/kernel/file_systems/nfs4/NFS4Server.h index 1bdc5a9f66..ebe83d2ade 100644 --- a/src/add-ons/kernel/file_systems/nfs4/NFS4Server.h +++ b/src/add-ons/kernel/file_systems/nfs4/NFS4Server.h @@ -28,8 +28,6 @@ public: uint64 ClientId(uint64 prevId = 0, bool forceNew = false); void ReleaseCID(uint64 cid); - inline uint32 SequenceId(); - inline uint32 LeaseTime(); private: status_t _ReclaimOpen(OpenFileCookie* cookie); @@ -48,20 +46,12 @@ private: uint32 fCIDUseCount; mutex fLock; - vint32 fSequenceId; - OpenFileCookie* fOpenFiles; mutex fOpenLock; RPC::Server* fServer; }; -inline uint32 -NFS4Server::SequenceId() -{ - return static_cast(atomic_add(&fSequenceId, 1)); -} - inline uint32 NFS4Server::LeaseTime() diff --git a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp index 5a97137b0e..35bcb2c1fb 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp @@ -153,7 +153,7 @@ RequestBuilder::LookUpUp() status_t 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) return B_BAD_VALUE; @@ -168,11 +168,8 @@ RequestBuilder::Open(OpenClaim claim, uint32 seq, uint32 access, uint64 id, char owner[128]; int pos = 0; - *(uint32*)(owner + pos) = ownerTime; - pos += sizeof(uint32); - - *(uint32*)(owner + pos) = ownerTID; - pos += sizeof(uint32); + *(uint64*)(owner + pos) = ownerId; + pos += sizeof(uint64); fRequest->Stream().AddOpaque(owner, pos); diff --git a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h index c13ea4365e..a557c65344 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h +++ b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h @@ -33,8 +33,7 @@ public: status_t LookUpUp(); status_t Open(OpenClaim claim, uint32 seq, uint32 access, uint64 id, OpenCreate oc, - uint32 ownerTime, uint32 ownerTID, - const char* name); + uint64 ownerId, const char* name); status_t OpenConfirm(uint32 seq, const uint32* id, uint32 stateSeq); status_t PutFH(const Filehandle& fh);