diff --git a/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.cpp b/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.cpp index 42b3461058..b77feae8f4 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 e01db01b3f..302457a721 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 {