added 1 changeset to branch 'refs/remotes/pdziepak-github/nfs4' old head: e8ef557a560f15c0133390e86288d17c2ad41114 new head: d72bdcc88a354b1fc118d05b204649843a4a6cbf overview: https://github.com/pdziepak/Haiku/compare/e8ef557...d72bdcc ---------------------------------------------------------------------------- d72bdcc: nfs4: Do not remove RootInode too soon [ Pawel Dziepak <pdziepak@xxxxxxxxxxx> ] ---------------------------------------------------------------------------- Commit: d72bdcc88a354b1fc118d05b204649843a4a6cbf Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Thu Jan 3 14:37:36 2013 UTC ---------------------------------------------------------------------------- 2 files changed, 16 insertions(+), 4 deletions(-) src/add-ons/kernel/file_systems/nfs4/VnodeToInode.cpp | 5 +++-- src/add-ons/kernel/file_systems/nfs4/VnodeToInode.h | 15 +++++++++++++-- ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.cpp b/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.cpp index 42b3461..b77feae 100644 --- a/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.cpp @@ -27,9 +27,10 @@ void VnodeToInode::Replace(Inode* newInode) { WriteLocker _(fLock); - if (fInode != NULL) + if (fInode != NULL && !IsRoot()) { fInode->GetFileSystem()->InoIdMap()->MarkRemoved(fID); - delete fInode; + delete fInode; + } fInode = newInode; if (fInode != NULL) { diff --git a/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.h b/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.h index e01db01..302457a 100644 --- a/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.h +++ b/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.h @@ -14,6 +14,7 @@ #include "Inode.h" #include "InodeIdMap.h" +#include "RootInode.h" class VnodeToInode { public: @@ -31,6 +32,8 @@ public: inline void Clear(); inline ino_t ID() const; + + inline bool IsRoot() const; private: ino_t fID; rw_lock fLock; @@ -70,7 +73,7 @@ inline VnodeToInode::~VnodeToInode() { Remove(); - if (fFileSystem != NULL) + if (fFileSystem != NULL && !IsRoot()) fFileSystem->InoIdMap()->RemoveEntry(fID); rw_lock_destroy(&fLock); } @@ -101,11 +104,19 @@ inline void VnodeToInode::Clear() { WriteLocker _(fLock); - delete fInode; + if (!IsRoot()) + delete fInode; fInode = NULL; } +inline bool +VnodeToInode::IsRoot() const +{ + return fInode && fFileSystem && fInode->ID() == fFileSystem->Root()->ID(); +} + + inline Inode* VnodeToInode::GetPointer() const {