nfs4: Fix OPEN and CLOSE sequence numbers
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user