nfs4: Fix CID #991617: Set cookie file system at its creation

This commit is contained in:
Pawel Dziepak 2013-06-13 01:49:42 +02:00
parent b92a3dcc61
commit 1192182c89
5 changed files with 46 additions and 17 deletions

View File

@ -67,8 +67,9 @@ LockInfo::operator==(const LockInfo& lock) const
}
Cookie::Cookie()
Cookie::Cookie(FileSystem* fileSystem)
:
fFileSystem(fileSystem),
fRequests(NULL),
fSnoozeCancel(create_sem(1, NULL))
{
@ -144,8 +145,16 @@ Cookie::CancelAll()
}
OpenFileCookie::OpenFileCookie()
OpenStateCookie::OpenStateCookie(FileSystem* fileSystem)
:
Cookie(fileSystem)
{
}
OpenFileCookie::OpenFileCookie(FileSystem* fileSystem)
:
OpenStateCookie(fileSystem),
fLocks(NULL)
{
}
@ -173,9 +182,23 @@ OpenFileCookie::RemoveLock(LockInfo* lock, LockInfo* prev)
}
OpenDirCookie::OpenDirCookie(FileSystem* fileSystem)
:
Cookie(fileSystem)
{
}
OpenDirCookie::~OpenDirCookie()
{
if (fSnapshot != NULL)
fSnapshot->ReleaseReference();
}
OpenAttrCookie::OpenAttrCookie(FileSystem* fileSystem)
:
OpenStateCookie(fileSystem)
{
}

View File

@ -66,7 +66,7 @@ struct Cookie {
sem_id fSnoozeCancel;
Cookie();
Cookie(FileSystem* fileSystem);
virtual ~Cookie();
status_t RegisterRequest(RPC::Request* req);
@ -77,6 +77,8 @@ struct Cookie {
struct OpenStateCookie : public Cookie {
OpenState* fOpenState;
uint32 fMode;
OpenStateCookie(FileSystem* fileSystem);
};
struct OpenFileCookie : public OpenStateCookie {
@ -85,7 +87,7 @@ struct OpenFileCookie : public OpenStateCookie {
void AddLock(LockInfo* lock);
void RemoveLock(LockInfo* lock, LockInfo* prev);
OpenFileCookie();
OpenFileCookie(FileSystem* fileSystem);
};
struct OpenDirCookie : public Cookie {
@ -96,10 +98,13 @@ struct OpenDirCookie : public Cookie {
bool fAttrDir;
OpenDirCookie(FileSystem* fileSystem);
~OpenDirCookie();
};
struct OpenAttrCookie : public OpenStateCookie { };
struct OpenAttrCookie : public OpenStateCookie {
OpenAttrCookie(FileSystem* fileSystem);
};
#endif // COOKIE_H

View File

@ -36,7 +36,6 @@ Inode::OpenDir(OpenDirCookie* cookie)
if (result != B_OK)
return result;
cookie->fFileSystem = fFileSystem;
cookie->fSpecial = 0;
cookie->fSnapshot = NULL;
cookie->fCurrent = NULL;
@ -52,7 +51,6 @@ Inode::OpenAttrDir(OpenDirCookie* cookie)
{
ASSERT(cookie != NULL);
cookie->fFileSystem = fFileSystem;
cookie->fSpecial = 0;
cookie->fSnapshot = NULL;
cookie->fCurrent = NULL;

View File

@ -84,7 +84,6 @@ Inode::Create(const char* name, int mode, int perms, OpenFileCookie* cookie,
}
cookie->fOpenState = state;
cookie->fFileSystem = fFileSystem;
*id = FileIdToInoT(state->fInfo.fFileId);
@ -168,7 +167,6 @@ Inode::Open(int mode, OpenFileCookie* cookie)
file_cache_set_size(fFileCache, 0);
}
cookie->fFileSystem = fFileSystem;
cookie->fMode = mode;
cookie->fLocks = NULL;
@ -262,7 +260,6 @@ Inode::OpenAttr(const char* _name, int mode, OpenAttrCookie* cookie,
fFileSystem->AddOpenFile(state);
cookie->fOpenState = state;
cookie->fFileSystem = fFileSystem;
cookie->fMode = mode;
if (data.fType != OPEN_DELEGATE_NONE) {

View File

@ -752,7 +752,9 @@ static status_t
nfs4_create(fs_volume* volume, fs_vnode* dir, const char* name, int openMode,
int perms, void** _cookie, ino_t* _newVnodeID)
{
OpenFileCookie* cookie = new OpenFileCookie;
FileSystem* fs = reinterpret_cast<FileSystem*>(volume->private_volume);
OpenFileCookie* cookie = new OpenFileCookie(fs);
if (cookie == NULL)
return B_NO_MEMORY;
*_cookie = cookie;
@ -766,7 +768,6 @@ nfs4_create(fs_volume* volume, fs_vnode* dir, const char* name, int openMode,
if (inode == NULL)
return B_ENTRY_NOT_FOUND;
FileSystem* fs = reinterpret_cast<FileSystem*>(volume->private_volume);
MutexLocker createLocker(fs->CreateFileLock());
OpenDelegationData data;
@ -826,7 +827,8 @@ nfs4_open(fs_volume* volume, fs_vnode* vnode, int openMode, void** _cookie)
return B_OK;
}
OpenFileCookie* cookie = new OpenFileCookie;
FileSystem* fs = reinterpret_cast<FileSystem*>(volume->private_volume);
OpenFileCookie* cookie = new OpenFileCookie(fs);
if (cookie == NULL)
return B_NO_MEMORY;
*_cookie = cookie;
@ -1003,7 +1005,8 @@ nfs4_remove_dir(fs_volume* volume, fs_vnode* parent, const char* name)
static status_t
nfs4_open_dir(fs_volume* volume, fs_vnode* vnode, void** _cookie)
{
OpenDirCookie* cookie = new(std::nothrow) OpenDirCookie;
FileSystem* fs = reinterpret_cast<FileSystem*>(volume->private_volume);
OpenDirCookie* cookie = new(std::nothrow) OpenDirCookie(fs);
if (cookie == NULL)
return B_NO_MEMORY;
*_cookie = cookie;
@ -1087,7 +1090,8 @@ nfs4_rewind_dir(fs_volume* volume, fs_vnode* vnode, void* _cookie)
static status_t
nfs4_open_attr_dir(fs_volume* volume, fs_vnode* vnode, void** _cookie)
{
OpenDirCookie* cookie = new(std::nothrow) OpenDirCookie;
FileSystem* fs = reinterpret_cast<FileSystem*>(volume->private_volume);
OpenDirCookie* cookie = new(std::nothrow) OpenDirCookie(fs);
if (cookie == NULL)
return B_NO_MEMORY;
*_cookie = cookie;
@ -1148,7 +1152,8 @@ nfs4_create_attr(fs_volume* volume, fs_vnode* vnode, const char* name,
if (inode == NULL)
return B_ENTRY_NOT_FOUND;
OpenAttrCookie* cookie = new OpenAttrCookie;
FileSystem* fs = reinterpret_cast<FileSystem*>(volume->private_volume);
OpenAttrCookie* cookie = new OpenAttrCookie(fs);
if (cookie == NULL)
return B_NO_MEMORY;
*_cookie = cookie;
@ -1172,7 +1177,8 @@ nfs4_open_attr(fs_volume* volume, fs_vnode* vnode, const char* name,
if (inode == NULL)
return B_ENTRY_NOT_FOUND;
OpenAttrCookie* cookie = new OpenAttrCookie;
FileSystem* fs = reinterpret_cast<FileSystem*>(volume->private_volume);
OpenAttrCookie* cookie = new OpenAttrCookie(fs);
if (cookie == NULL)
return B_NO_MEMORY;
*_cookie = cookie;