nfs4: Use FileInfo instead of filehandle to identify a file
This commit is contained in:
@@ -74,7 +74,7 @@ struct OpenFileCookie : public Cookie {
|
|||||||
|
|
||||||
uint32 fMode;
|
uint32 fMode;
|
||||||
|
|
||||||
Filehandle fHandle;
|
FileInfo fInfo;
|
||||||
uint32 fStateId[3];
|
uint32 fStateId[3];
|
||||||
uint32 fStateSeq;
|
uint32 fStateSeq;
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ struct Filehandle {
|
|||||||
// since OPEN requires both parent filehandle and file name (just like LOOKUP).
|
// since OPEN requires both parent filehandle and file name (just like LOOKUP).
|
||||||
struct FileInfo {
|
struct FileInfo {
|
||||||
uint64 fFileId;
|
uint64 fFileId;
|
||||||
Filehandle fFH;
|
Filehandle fHandle;
|
||||||
|
|
||||||
Filehandle fParent;
|
Filehandle fParent;
|
||||||
const char* fName;
|
const char* fName;
|
||||||
@@ -101,7 +101,7 @@ inline
|
|||||||
FileInfo::FileInfo(const FileInfo& fi)
|
FileInfo::FileInfo(const FileInfo& fi)
|
||||||
:
|
:
|
||||||
fFileId(fi.fFileId),
|
fFileId(fi.fFileId),
|
||||||
fFH(fi.fFH),
|
fHandle(fi.fHandle),
|
||||||
fParent(fi.fParent),
|
fParent(fi.fParent),
|
||||||
fName(strdup(fi.fName)),
|
fName(strdup(fi.fName)),
|
||||||
fPath(strdup(fi.fPath))
|
fPath(strdup(fi.fPath))
|
||||||
@@ -113,7 +113,7 @@ inline FileInfo&
|
|||||||
FileInfo::operator=(const FileInfo& fi)
|
FileInfo::operator=(const FileInfo& fi)
|
||||||
{
|
{
|
||||||
fFileId = fi.fFileId;
|
fFileId = fi.fFileId;
|
||||||
fFH = fi.fFH;
|
fHandle = fi.fHandle;
|
||||||
fParent = fi.fParent;
|
fParent = fi.fParent;
|
||||||
|
|
||||||
free(const_cast<char*>(fName));
|
free(const_cast<char*>(fName));
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ Filesystem::Mount(Filesystem** pfs, RPC::Server* serv, const char* fsPath,
|
|||||||
fs->fDevId = id;
|
fs->fDevId = id;
|
||||||
fs->fFsId = *fsid;
|
fs->fFsId = *fsid;
|
||||||
|
|
||||||
fi.fFH = fh;
|
fi.fHandle = fh;
|
||||||
fi.fParent = fh;
|
fi.fParent = fh;
|
||||||
fi.fPath = strdup(sGetPath(fs->fPath, fsPath));
|
fi.fPath = strdup(sGetPath(fs->fPath, fsPath));
|
||||||
|
|
||||||
|
|||||||
@@ -34,18 +34,15 @@ Inode::CreateInode(Filesystem* fs, const FileInfo &fi, Inode** _inode)
|
|||||||
if (inode == NULL)
|
if (inode == NULL)
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
inode->fHandle = fi.fFH;
|
inode->fInfo = fi;
|
||||||
inode->fFilesystem = fs;
|
inode->fFilesystem = fs;
|
||||||
inode->fParentFH = fi.fParent;
|
|
||||||
inode->fName = strdup(fi.fName);
|
|
||||||
inode->fPath = strdup(fi.fPath);
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
RPC::Server* serv = fs->Server();
|
RPC::Server* serv = fs->Server();
|
||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(inode->fHandle);
|
req.PutFH(inode->fInfo.fHandle);
|
||||||
|
|
||||||
Attribute attr[] = { FATTR4_TYPE, FATTR4_FSID, FATTR4_FILEID };
|
Attribute attr[] = { FATTR4_TYPE, FATTR4_FSID, FATTR4_FILEID };
|
||||||
req.GetAttr(attr, sizeof(attr) / sizeof(Attribute));
|
req.GetAttr(attr, sizeof(attr) / sizeof(Attribute));
|
||||||
@@ -69,11 +66,11 @@ Inode::CreateInode(Filesystem* fs, const FileInfo &fi, Inode** _inode)
|
|||||||
|
|
||||||
if (fi.fFileId == 0) {
|
if (fi.fFileId == 0) {
|
||||||
if (count < 3 || values[2].fAttribute != FATTR4_FILEID)
|
if (count < 3 || values[2].fAttribute != FATTR4_FILEID)
|
||||||
inode->fFileId = fs->AllocFileId();
|
inode->fInfo.fFileId = fs->AllocFileId();
|
||||||
else
|
else
|
||||||
inode->fFileId = values[2].fData.fValue64;
|
inode->fInfo.fFileId = values[2].fData.fValue64;
|
||||||
} else
|
} else
|
||||||
inode->fFileId = fi.fFileId;
|
inode->fInfo.fFileId = fi.fFileId;
|
||||||
|
|
||||||
// FATTR4_TYPE is mandatory
|
// FATTR4_TYPE is mandatory
|
||||||
inode->fType = values[0].fData.fValue32;
|
inode->fType = values[0].fData.fValue32;
|
||||||
@@ -97,7 +94,7 @@ Inode::CreateInode(Filesystem* fs, const FileInfo &fi, Inode** _inode)
|
|||||||
|
|
||||||
Inode::~Inode()
|
Inode::~Inode()
|
||||||
{
|
{
|
||||||
free(const_cast<char*>(fName));
|
free(const_cast<char*>(fInfo.fName));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -117,7 +114,7 @@ Inode::LookUp(const char* name, ino_t* id)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
|
|
||||||
if (!strcmp(name, ".."))
|
if (!strcmp(name, ".."))
|
||||||
req.LookUpUp();
|
req.LookUpUp();
|
||||||
@@ -174,13 +171,13 @@ Inode::LookUp(const char* name, ino_t* id)
|
|||||||
|
|
||||||
FileInfo fi;
|
FileInfo fi;
|
||||||
fi.fFileId = fileId;
|
fi.fFileId = fileId;
|
||||||
fi.fFH = fh;
|
fi.fHandle = fh;
|
||||||
fi.fParent = fHandle;
|
fi.fParent = fInfo.fHandle;
|
||||||
fi.fName = strdup(name);
|
fi.fName = strdup(name);
|
||||||
|
|
||||||
char* path = reinterpret_cast<char*>(malloc(strlen(name) + 2 +
|
char* path = reinterpret_cast<char*>(malloc(strlen(name) + 2 +
|
||||||
strlen(fPath)));
|
strlen(fInfo.fPath)));
|
||||||
strcpy(path, fPath);
|
strcpy(path, fInfo.fPath);
|
||||||
strcat(path, "/");
|
strcat(path, "/");
|
||||||
strcat(path, name);
|
strcat(path, name);
|
||||||
fi.fPath = path;
|
fi.fPath = path;
|
||||||
@@ -200,9 +197,9 @@ Inode::Link(Inode* dir, const char* name)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
req.SaveFH();
|
req.SaveFH();
|
||||||
req.PutFH(dir->fHandle);
|
req.PutFH(dir->fInfo.fHandle);
|
||||||
req.Link(name);
|
req.Link(name);
|
||||||
|
|
||||||
status_t result = request.Send();
|
status_t result = request.Send();
|
||||||
@@ -244,7 +241,7 @@ Inode::Remove(const char* name, FileType type)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
req.LookUp(name);
|
req.LookUp(name);
|
||||||
AttrValue attr;
|
AttrValue attr;
|
||||||
attr.fAttribute = FATTR4_TYPE;
|
attr.fAttribute = FATTR4_TYPE;
|
||||||
@@ -255,7 +252,7 @@ Inode::Remove(const char* name, FileType type)
|
|||||||
else
|
else
|
||||||
req.Nverify(&attr, 1);
|
req.Nverify(&attr, 1);
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
req.Remove(name);
|
req.Remove(name);
|
||||||
|
|
||||||
status_t result = request.Send();
|
status_t result = request.Send();
|
||||||
@@ -305,9 +302,9 @@ Inode::Rename(Inode* from, Inode* to, const char* fromName, const char* toName)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(from->fHandle);
|
req.PutFH(from->fInfo.fHandle);
|
||||||
req.SaveFH();
|
req.SaveFH();
|
||||||
req.PutFH(to->fHandle);
|
req.PutFH(to->fInfo.fHandle);
|
||||||
req.Rename(fromName, toName);
|
req.Rename(fromName, toName);
|
||||||
|
|
||||||
status_t result = request.Send();
|
status_t result = request.Send();
|
||||||
@@ -346,7 +343,7 @@ Inode::CreateLink(const char* name, const char* path, int mode)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
|
|
||||||
AttrValue attr;
|
AttrValue attr;
|
||||||
attr.fAttribute = FATTR4_MODE;
|
attr.fAttribute = FATTR4_MODE;
|
||||||
@@ -381,7 +378,7 @@ Inode::ReadLink(void* buffer, size_t* length)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
req.ReadLink();
|
req.ReadLink();
|
||||||
|
|
||||||
status_t result = request.Send();
|
status_t result = request.Send();
|
||||||
@@ -412,7 +409,7 @@ Inode::Access(int mode)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
req.Access();
|
req.Access();
|
||||||
|
|
||||||
status_t result = request.Send();
|
status_t result = request.Send();
|
||||||
@@ -460,7 +457,7 @@ Inode::Stat(struct stat* st)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
|
|
||||||
Attribute attr[] = { FATTR4_SIZE, FATTR4_MODE, FATTR4_NUMLINKS,
|
Attribute attr[] = { FATTR4_SIZE, FATTR4_MODE, FATTR4_NUMLINKS,
|
||||||
FATTR4_TIME_ACCESS, FATTR4_TIME_CREATE,
|
FATTR4_TIME_ACCESS, FATTR4_TIME_CREATE,
|
||||||
@@ -499,7 +496,7 @@ Inode::Stat(struct stat* st)
|
|||||||
} else {
|
} else {
|
||||||
// Try to guess using ACCESS request
|
// Try to guess using ACCESS request
|
||||||
request.Reset();
|
request.Reset();
|
||||||
request.Builder().PutFH(fHandle);
|
request.Builder().PutFH(fInfo.fHandle);
|
||||||
request.Builder().Access();
|
request.Builder().Access();
|
||||||
result = request.Send();
|
result = request.Send();
|
||||||
if (result != B_OK)
|
if (result != B_OK)
|
||||||
@@ -617,7 +614,7 @@ Inode::WriteStat(const struct stat* st, uint32 mask)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
if ((mask & B_STAT_SIZE) != 0)
|
if ((mask & B_STAT_SIZE) != 0)
|
||||||
req.SetAttr(cookie->fStateId, cookie->fStateSeq, attr, i);
|
req.SetAttr(cookie->fStateId, cookie->fStateSeq, attr, i);
|
||||||
else
|
else
|
||||||
@@ -690,7 +687,7 @@ Inode::TestLock(OpenFileCookie* cookie, struct flock* lock)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
req.LockT(sGetLockType(lock->l_type, false), lock->l_start,
|
req.LockT(sGetLockType(lock->l_type, false), lock->l_start,
|
||||||
lock->l_len, cookie);
|
lock->l_len, cookie);
|
||||||
|
|
||||||
@@ -760,7 +757,7 @@ Inode::AcquireLock(OpenFileCookie* cookie, const struct flock* lock,
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
req.Lock(cookie, linfo);
|
req.Lock(cookie, linfo);
|
||||||
|
|
||||||
status_t result = request.Send();
|
status_t result = request.Send();
|
||||||
@@ -829,7 +826,7 @@ Inode::ReleaseLock(OpenFileCookie* cookie, const struct flock* lock)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
req.LockU(linfo);
|
req.LockU(linfo);
|
||||||
|
|
||||||
status_t result = request.Send();
|
status_t result = request.Send();
|
||||||
@@ -874,7 +871,7 @@ Inode::ReleaseAllLocks(OpenFileCookie* cookie)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
req.LockU(linfo);
|
req.LockU(linfo);
|
||||||
|
|
||||||
status_t result = request.Send();
|
status_t result = request.Send();
|
||||||
@@ -1021,7 +1018,7 @@ Inode::_LookUpFilehandle()
|
|||||||
uint32 lookupCount = 0;
|
uint32 lookupCount = 0;
|
||||||
|
|
||||||
sParsePath(req, &lookupCount, fFilesystem->Path());
|
sParsePath(req, &lookupCount, fFilesystem->Path());
|
||||||
sParsePath(req, &lookupCount, fPath);
|
sParsePath(req, &lookupCount, fInfo.fPath);
|
||||||
|
|
||||||
req.GetFH();
|
req.GetFH();
|
||||||
|
|
||||||
@@ -1029,7 +1026,7 @@ Inode::_LookUpFilehandle()
|
|||||||
AttrValue attr;
|
AttrValue attr;
|
||||||
attr.fAttribute = FATTR4_FILEID;
|
attr.fAttribute = FATTR4_FILEID;
|
||||||
attr.fFreePointer = false;
|
attr.fFreePointer = false;
|
||||||
attr.fData.fValue64 = fFileId;
|
attr.fData.fValue64 = fInfo.fFileId;
|
||||||
req.Verify(&attr, 1);
|
req.Verify(&attr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1043,7 +1040,7 @@ Inode::_LookUpFilehandle()
|
|||||||
for (uint32 i = 0; i < lookupCount; i++)
|
for (uint32 i = 0; i < lookupCount; i++)
|
||||||
reply.LookUp();
|
reply.LookUp();
|
||||||
|
|
||||||
result = reply.GetFH(&fHandle);
|
result = reply.GetFH(&fInfo.fHandle);
|
||||||
if (result != B_OK)
|
if (result != B_OK)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
|||||||
@@ -90,16 +90,10 @@ protected:
|
|||||||
|
|
||||||
static inline ino_t _FileIdToInoT(uint64 fileid);
|
static inline ino_t _FileIdToInoT(uint64 fileid);
|
||||||
|
|
||||||
uint64 fFileId;
|
|
||||||
uint32 fType;
|
uint32 fType;
|
||||||
|
|
||||||
Filehandle fHandle;
|
FileInfo fInfo;
|
||||||
Filesystem* fFilesystem;
|
Filesystem* fFilesystem;
|
||||||
|
|
||||||
Filehandle fParentFH;
|
|
||||||
const char* fName;
|
|
||||||
|
|
||||||
const char* fPath;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -117,7 +111,7 @@ Inode::_FileIdToInoT(uint64 fileid)
|
|||||||
inline ino_t
|
inline ino_t
|
||||||
Inode::ID() const
|
Inode::ID() const
|
||||||
{
|
{
|
||||||
return _FileIdToInoT(fFileId);
|
return _FileIdToInoT(fInfo.fFileId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -131,7 +125,7 @@ Inode::Type() const
|
|||||||
inline const char*
|
inline const char*
|
||||||
Inode::Name() const
|
Inode::Name() const
|
||||||
{
|
{
|
||||||
return fName;
|
return fInfo.fName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ Inode::CreateDir(const char* name, int mode)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
|
|
||||||
AttrValue attr;
|
AttrValue attr;
|
||||||
attr.fAttribute = FATTR4_MODE;
|
attr.fAttribute = FATTR4_MODE;
|
||||||
@@ -59,7 +59,7 @@ Inode::OpenDir(OpenDirCookie* cookie)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
req.Access();
|
req.Access();
|
||||||
|
|
||||||
status_t result = request.Send();
|
status_t result = request.Send();
|
||||||
@@ -99,7 +99,7 @@ Inode::_ReadDirOnce(DirEntry** dirents, uint32* count, OpenDirCookie* cookie,
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
|
|
||||||
Attribute attr[] = { FATTR4_FSID, FATTR4_FILEID };
|
Attribute attr[] = { FATTR4_FSID, FATTR4_FILEID };
|
||||||
req.ReadDir(*count, cookie->fCookie, cookie->fCookieVerf, attr,
|
req.ReadDir(*count, cookie->fCookie, cookie->fCookieVerf, attr,
|
||||||
@@ -151,7 +151,7 @@ Inode::_ReadDirUp(struct dirent* de, uint32 pos, uint32 size)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
req.LookUpUp();
|
req.LookUpUp();
|
||||||
req.GetFH();
|
req.GetFH();
|
||||||
|
|
||||||
@@ -214,7 +214,7 @@ Inode::ReadDir(void* _buffer, uint32 size, uint32* _count,
|
|||||||
if (cookie->fCookie == 0 && cookie->fCookieVerf == 2 && count < *_count) {
|
if (cookie->fCookie == 0 && cookie->fCookieVerf == 2 && count < *_count) {
|
||||||
struct dirent* de = reinterpret_cast<dirent*>(buffer + pos);
|
struct dirent* de = reinterpret_cast<dirent*>(buffer + pos);
|
||||||
|
|
||||||
_FillDirEntry(de, fFileId, ".", pos, size);
|
_FillDirEntry(de, fInfo.fFileId, ".", pos, size);
|
||||||
|
|
||||||
pos += de->d_reclen;
|
pos += de->d_reclen;
|
||||||
count++;
|
count++;
|
||||||
@@ -224,10 +224,10 @@ Inode::ReadDir(void* _buffer, uint32 size, uint32* _count,
|
|||||||
if (cookie->fCookie == 0 && cookie->fCookieVerf == 1 && count < *_count) {
|
if (cookie->fCookie == 0 && cookie->fCookieVerf == 1 && count < *_count) {
|
||||||
struct dirent* de = reinterpret_cast<dirent*>(buffer + pos);
|
struct dirent* de = reinterpret_cast<dirent*>(buffer + pos);
|
||||||
|
|
||||||
if (strcmp(fName, "/"))
|
if (strcmp(fInfo.fName, "/"))
|
||||||
_ReadDirUp(de, pos, size);
|
_ReadDirUp(de, pos, size);
|
||||||
else
|
else
|
||||||
_FillDirEntry(de, _FileIdToInoT(fFileId), "..", pos, size);
|
_FillDirEntry(de, _FileIdToInoT(fInfo.fFileId), "..", pos, size);
|
||||||
|
|
||||||
pos += de->d_reclen;
|
pos += de->d_reclen;
|
||||||
count++;
|
count++;
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ Inode::Create(const char* name, int mode, int perms, OpenFileCookie* cookie,
|
|||||||
|
|
||||||
cookie->fOwnerId = atomic_add64(&cookie->fLastOwnerId, 1);
|
cookie->fOwnerId = atomic_add64(&cookie->fLastOwnerId, 1);
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
|
|
||||||
AttrValue cattr[2];
|
AttrValue cattr[2];
|
||||||
uint32 i = 0;
|
uint32 i = 0;
|
||||||
@@ -130,13 +130,13 @@ Inode::Create(const char* name, int mode, int perms, OpenFileCookie* cookie,
|
|||||||
|
|
||||||
FileInfo fi;
|
FileInfo fi;
|
||||||
fi.fFileId = fileId;
|
fi.fFileId = fileId;
|
||||||
fi.fFH = fh;
|
fi.fHandle = fh;
|
||||||
fi.fParent = fHandle;
|
fi.fParent = fInfo.fHandle;
|
||||||
fi.fName = strdup(name);
|
fi.fName = strdup(name);
|
||||||
|
|
||||||
char* path = reinterpret_cast<char*>(malloc(strlen(name) + 2 +
|
char* path = reinterpret_cast<char*>(malloc(strlen(name) + 2 +
|
||||||
strlen(fPath)));
|
strlen(fInfo.fPath)));
|
||||||
strcpy(path, fPath);
|
strcpy(path, fInfo.fPath);
|
||||||
strcat(path, "/");
|
strcat(path, "/");
|
||||||
strcat(path, name);
|
strcat(path, name);
|
||||||
fi.fPath = path;
|
fi.fPath = path;
|
||||||
@@ -144,7 +144,7 @@ Inode::Create(const char* name, int mode, int perms, OpenFileCookie* cookie,
|
|||||||
fFilesystem->InoIdMap()->AddEntry(fi, *id);
|
fFilesystem->InoIdMap()->AddEntry(fi, *id);
|
||||||
|
|
||||||
cookie->fFilesystem = fFilesystem;
|
cookie->fFilesystem = fFilesystem;
|
||||||
cookie->fHandle = fh;
|
cookie->fInfo = fi;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
} while (true);
|
} while (true);
|
||||||
@@ -165,7 +165,7 @@ Inode::Open(int mode, OpenFileCookie* cookie)
|
|||||||
status_t result;
|
status_t result;
|
||||||
|
|
||||||
cookie->fFilesystem = fFilesystem;
|
cookie->fFilesystem = fFilesystem;
|
||||||
cookie->fHandle = fHandle;
|
cookie->fInfo = fInfo;
|
||||||
cookie->fMode = mode;
|
cookie->fMode = mode;
|
||||||
cookie->fSequence = 0;
|
cookie->fSequence = 0;
|
||||||
cookie->fLocks = NULL;
|
cookie->fLocks = NULL;
|
||||||
@@ -182,36 +182,36 @@ Inode::Open(int mode, OpenFileCookie* cookie)
|
|||||||
// Since we are opening the file using a pair (parentFH, name) we
|
// Since we are opening the file using a pair (parentFH, name) we
|
||||||
// need to check for race conditions.
|
// need to check for race conditions.
|
||||||
if (fFilesystem->IsAttrSupported(FATTR4_FILEID)) {
|
if (fFilesystem->IsAttrSupported(FATTR4_FILEID)) {
|
||||||
req.PutFH(fParentFH);
|
req.PutFH(fInfo.fParent);
|
||||||
req.LookUp(fName);
|
req.LookUp(fInfo.fName);
|
||||||
AttrValue attr;
|
AttrValue attr;
|
||||||
attr.fAttribute = FATTR4_FILEID;
|
attr.fAttribute = FATTR4_FILEID;
|
||||||
attr.fFreePointer = false;
|
attr.fFreePointer = false;
|
||||||
attr.fData.fValue64 = fFileId;
|
attr.fData.fValue64 = fInfo.fFileId;
|
||||||
req.Verify(&attr, 1);
|
req.Verify(&attr, 1);
|
||||||
} else if (fFilesystem->ExpireType() == FH4_PERSISTENT) {
|
} else if (fFilesystem->ExpireType() == FH4_PERSISTENT) {
|
||||||
req.PutFH(fParentFH);
|
req.PutFH(fInfo.fParent);
|
||||||
req.LookUp(fName);
|
req.LookUp(fInfo.fName);
|
||||||
AttrValue attr;
|
AttrValue attr;
|
||||||
attr.fAttribute = FATTR4_FILEHANDLE;
|
attr.fAttribute = FATTR4_FILEHANDLE;
|
||||||
attr.fFreePointer = true;
|
attr.fFreePointer = true;
|
||||||
attr.fData.fPointer = malloc(sizeof(fHandle));
|
attr.fData.fPointer = malloc(sizeof(fInfo.fHandle));
|
||||||
memcpy(attr.fData.fPointer, &fHandle, sizeof(fHandle));
|
memcpy(attr.fData.fPointer, &fInfo.fHandle, sizeof(fInfo.fHandle));
|
||||||
req.Verify(&attr, 1);
|
req.Verify(&attr, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
req.PutFH(fParentFH);
|
req.PutFH(fInfo.fParent);
|
||||||
if ((mode & O_TRUNC) == O_TRUNC) {
|
if ((mode & O_TRUNC) == O_TRUNC) {
|
||||||
AttrValue attr;
|
AttrValue attr;
|
||||||
attr.fAttribute = FATTR4_SIZE;
|
attr.fAttribute = FATTR4_SIZE;
|
||||||
attr.fFreePointer = false;
|
attr.fFreePointer = false;
|
||||||
attr.fData.fValue64 = 0;
|
attr.fData.fValue64 = 0;
|
||||||
req.Open(CLAIM_NULL, cookie->fSequence++, sModeToAccess(mode),
|
req.Open(CLAIM_NULL, cookie->fSequence++, sModeToAccess(mode),
|
||||||
cookie->fClientId, OPEN4_CREATE, cookie->fOwnerId, fName, &attr,
|
cookie->fClientId, OPEN4_CREATE, cookie->fOwnerId, fInfo.fName,
|
||||||
1, false);
|
&attr, 1, false);
|
||||||
} else
|
} else
|
||||||
req.Open(CLAIM_NULL, cookie->fSequence++, sModeToAccess(mode),
|
req.Open(CLAIM_NULL, cookie->fSequence++, sModeToAccess(mode),
|
||||||
cookie->fClientId, OPEN4_NOCREATE, cookie->fOwnerId, fName);
|
cookie->fClientId, OPEN4_NOCREATE, cookie->fOwnerId, fInfo.fName);
|
||||||
|
|
||||||
result = request.Send();
|
result = request.Send();
|
||||||
if (result != B_OK)
|
if (result != B_OK)
|
||||||
@@ -248,7 +248,7 @@ Inode::Open(int mode, OpenFileCookie* cookie)
|
|||||||
fFilesystem->AddOpenFile(cookie);
|
fFilesystem->AddOpenFile(cookie);
|
||||||
|
|
||||||
if (confirm)
|
if (confirm)
|
||||||
return _ConfirmOpen(fHandle, cookie);
|
return _ConfirmOpen(fInfo.fHandle, cookie);
|
||||||
else
|
else
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
@@ -264,7 +264,7 @@ Inode::Close(OpenFileCookie* cookie)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
req.Close(cookie->fSequence++, cookie->fStateId,
|
req.Close(cookie->fSequence++, cookie->fStateId,
|
||||||
cookie->fStateSeq);
|
cookie->fStateSeq);
|
||||||
|
|
||||||
@@ -302,7 +302,7 @@ Inode::Read(OpenFileCookie* cookie, off_t pos, void* buffer, size_t* _length)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
req.Read(cookie->fStateId, cookie->fStateSeq, pos + size,
|
req.Read(cookie->fStateId, cookie->fStateSeq, pos + size,
|
||||||
*_length - size);
|
*_length - size);
|
||||||
|
|
||||||
@@ -358,7 +358,7 @@ Inode::Write(OpenFileCookie* cookie, off_t pos, const void* _buffer,
|
|||||||
pos = fileSize;
|
pos = fileSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
if ((cookie->fMode & O_APPEND) == O_APPEND) {
|
if ((cookie->fMode & O_APPEND) == O_APPEND) {
|
||||||
AttrValue attr;
|
AttrValue attr;
|
||||||
attr.fAttribute = FATTR4_SIZE;
|
attr.fAttribute = FATTR4_SIZE;
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ NFS4Server::_ReclaimOpen(OpenFileCookie* cookie)
|
|||||||
Request request(fServer);
|
Request request(fServer);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(cookie->fHandle);
|
req.PutFH(cookie->fInfo.fHandle);
|
||||||
req.Open(CLAIM_PREVIOUS, cookie->fSequence++, sModeToAccess(cookie->fMode),
|
req.Open(CLAIM_PREVIOUS, cookie->fSequence++, sModeToAccess(cookie->fMode),
|
||||||
cookie->fClientId, OPEN4_NOCREATE, cookie->fOwnerId, NULL);
|
cookie->fClientId, OPEN4_NOCREATE, cookie->fOwnerId, NULL);
|
||||||
|
|
||||||
@@ -97,7 +97,7 @@ NFS4Server::_ReclaimOpen(OpenFileCookie* cookie)
|
|||||||
if (confirm) {
|
if (confirm) {
|
||||||
request.Reset();
|
request.Reset();
|
||||||
|
|
||||||
req.PutFH(cookie->fHandle);
|
req.PutFH(cookie->fInfo.fHandle);
|
||||||
req.OpenConfirm(cookie->fSequence++, cookie->fStateId,
|
req.OpenConfirm(cookie->fSequence++, cookie->fStateId,
|
||||||
cookie->fStateSeq);
|
cookie->fStateSeq);
|
||||||
|
|
||||||
@@ -131,7 +131,7 @@ NFS4Server::_ReclaimLocks(OpenFileCookie* cookie)
|
|||||||
Request request(fServer);
|
Request request(fServer);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(cookie->fHandle);
|
req.PutFH(cookie->fInfo.fHandle);
|
||||||
req.Lock(cookie, linfo, true);
|
req.Lock(cookie, linfo, true);
|
||||||
|
|
||||||
status_t result = request.Send();
|
status_t result = request.Send();
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ RootInode::ReadInfo(struct fs_info* info)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
Attribute attr[] = { FATTR4_FILES_FREE, FATTR4_FILES_TOTAL,
|
Attribute attr[] = { FATTR4_FILES_FREE, FATTR4_FILES_TOTAL,
|
||||||
FATTR4_MAXREAD, FATTR4_MAXWRITE, FATTR4_SPACE_FREE,
|
FATTR4_MAXREAD, FATTR4_MAXWRITE, FATTR4_SPACE_FREE,
|
||||||
FATTR4_SPACE_TOTAL };
|
FATTR4_SPACE_TOTAL };
|
||||||
@@ -87,7 +87,7 @@ RootInode::ReadInfo(struct fs_info* info)
|
|||||||
} while (true);
|
} while (true);
|
||||||
|
|
||||||
info->flags = 0;
|
info->flags = 0;
|
||||||
strncpy(info->volume_name, fName, B_FILE_NAME_LENGTH);
|
strncpy(info->volume_name, fInfo.fName, B_FILE_NAME_LENGTH);
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
@@ -101,7 +101,7 @@ RootInode::ProbeMigration()
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
req.Access();
|
req.Access();
|
||||||
|
|
||||||
status_t result = request.Send();
|
status_t result = request.Send();
|
||||||
@@ -130,7 +130,7 @@ RootInode::GetLocations(AttrValue** attrv)
|
|||||||
Request request(serv);
|
Request request(serv);
|
||||||
RequestBuilder& req = request.Builder();
|
RequestBuilder& req = request.Builder();
|
||||||
|
|
||||||
req.PutFH(fHandle);
|
req.PutFH(fInfo.fHandle);
|
||||||
Attribute attr[] = { FATTR4_FS_LOCATIONS };
|
Attribute attr[] = { FATTR4_FS_LOCATIONS };
|
||||||
req.GetAttr(attr, sizeof(attr) / sizeof(Attribute));
|
req.GetAttr(attr, sizeof(attr) / sizeof(Attribute));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user