From 1192182c891fc8001653472ab0e143c80b24e745 Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Thu, 13 Jun 2013 01:49:42 +0200 Subject: [PATCH] nfs4: Fix CID #991617: Set cookie file system at its creation --- .../kernel/file_systems/nfs4/Cookie.cpp | 27 +++++++++++++++++-- src/add-ons/kernel/file_systems/nfs4/Cookie.h | 11 +++++--- .../kernel/file_systems/nfs4/InodeDir.cpp | 2 -- .../kernel/file_systems/nfs4/InodeRegular.cpp | 3 --- .../file_systems/nfs4/kernel_interface.cpp | 20 +++++++++----- 5 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/add-ons/kernel/file_systems/nfs4/Cookie.cpp b/src/add-ons/kernel/file_systems/nfs4/Cookie.cpp index 1fbfe5cc6b..940a5d9ff3 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Cookie.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Cookie.cpp @@ -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) +{ +} + diff --git a/src/add-ons/kernel/file_systems/nfs4/Cookie.h b/src/add-ons/kernel/file_systems/nfs4/Cookie.h index a3d36c9c8c..056fb5d845 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Cookie.h +++ b/src/add-ons/kernel/file_systems/nfs4/Cookie.h @@ -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 diff --git a/src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp b/src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp index eef37a619a..4d78e096fe 100644 --- a/src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp @@ -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; diff --git a/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp b/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp index d591fddda2..4b7b692ac9 100644 --- a/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp @@ -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) { diff --git a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp index 522a9eb477..b8f7294dff 100644 --- a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp @@ -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(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(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(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(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(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(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(volume->private_volume); + OpenAttrCookie* cookie = new OpenAttrCookie(fs); if (cookie == NULL) return B_NO_MEMORY; *_cookie = cookie;