From 636e922e5c38aab48923a27a7f8d73300b7bda62 Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Tue, 26 Jun 2012 17:21:06 +0200 Subject: [PATCH] nfs4: Fix cookie and vnode creation in create() hook --- src/add-ons/kernel/file_systems/nfs4/Cookie.cpp | 2 +- src/add-ons/kernel/file_systems/nfs4/Cookie.h | 3 +-- src/add-ons/kernel/file_systems/nfs4/Inode.cpp | 9 +++++---- .../kernel/file_systems/nfs4/kernel_interface.cpp | 5 +++++ 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/add-ons/kernel/file_systems/nfs4/Cookie.cpp b/src/add-ons/kernel/file_systems/nfs4/Cookie.cpp index e2cc986c43..2cf9f0d9d4 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Cookie.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Cookie.cpp @@ -77,7 +77,7 @@ Cookie::CancelAll() mutex_lock(&fRequestLock); RequestEntry* ent = fRequests; while (ent != NULL) { - fInode->FileSystem()->Server()->WakeCall(ent->fRequest); + fFilesystem->Server()->WakeCall(ent->fRequest); ent = ent->fNext; } mutex_unlock(&fRequestLock); diff --git a/src/add-ons/kernel/file_systems/nfs4/Cookie.h b/src/add-ons/kernel/file_systems/nfs4/Cookie.h index 13671baee0..82fcdc4439 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Cookie.h +++ b/src/add-ons/kernel/file_systems/nfs4/Cookie.h @@ -13,7 +13,6 @@ #include "Filesystem.h" -class Inode; struct Cookie { struct RequestEntry { @@ -21,7 +20,7 @@ struct Cookie { RequestEntry* fNext; }; - Inode* fInode; + Filesystem* fFilesystem; RequestEntry* fRequests; mutex fRequestLock; diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp index 847b35428d..93d60196ec 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp @@ -712,8 +712,6 @@ Inode::Create(const char* name, int mode, int perms, OpenFileCookie* cookie, bool confirm; status_t result; - cookie->fInode = this; - cookie->fHandle = fHandle; cookie->fMode = mode; cookie->fSequence = 0; @@ -811,6 +809,9 @@ Inode::Create(const char* name, int mode, int perms, OpenFileCookie* cookie, fFilesystem->InoIdMap()->AddEntry(fi, *id); + cookie->fFilesystem = fFilesystem; + cookie->fHandle = fh; + break; } while (true); @@ -829,7 +830,7 @@ Inode::Open(int mode, OpenFileCookie* cookie) bool confirm; status_t result; - cookie->fInode = this; + cookie->fFilesystem = fFilesystem; cookie->fHandle = fHandle; cookie->fMode = mode; cookie->fSequence = 0; @@ -1131,7 +1132,7 @@ Inode::OpenDir(OpenDirCookie* cookie) if (allowed & ACCESS4_READ != ACCESS4_READ) return B_PERMISSION_DENIED; - cookie->fInode = this; + cookie->fFilesystem = fFilesystem; cookie->fCookie = 0; cookie->fCookieVerf = 2; 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 220c2b7aaf..b134504eee 100644 --- a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp @@ -278,6 +278,11 @@ nfs4_create(fs_volume* volume, fs_vnode* dir, const char* name, int openMode, if (result != B_OK) delete cookie; + void* ptr; + result = get_vnode(volume, *_newVnodeID, &ptr); + if (result != B_OK) + delete cookie; + return result; }