From 12539c39d3f843f8c55cb4e03ccaaf6d08025b3e Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Wed, 18 Mar 2009 13:25:47 +0000 Subject: [PATCH] Remove and delete the VNode in _WriteVNode()/RemoveVNode() after the client FS is done with it, since we still need to serve file cache requests. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29587 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../userlandfs/kernel_add_on/Volume.cpp | 45 ++++++++++++++----- .../userlandfs/kernel_add_on/Volume.h | 2 + 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.cpp b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.cpp index 4202539ac3..3697e9a6e3 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.cpp @@ -254,6 +254,33 @@ private: }; +// VNodeRemover +class Volume::VNodeRemover { +public: + VNodeRemover(Volume* volume, VNode* node) + : + fVolume(volume), + fNode(node) + { + } + + ~VNodeRemover() + { + if (fNode != NULL) { + MutexLocker locker(fVolume->fLock); + fVolume->fVNodes->Remove(fNode); + locker.Unlock(); + + fNode->Delete(fVolume); + } + } + +private: + Volume* fVolume; + VNode* fNode; +}; + + // constructor Volume::Volume(FileSystem* fileSystem, fs_volume* fsVolume) : @@ -1062,13 +1089,12 @@ Volume::RemoveVNode(void* _node, bool reenter) { VNode* vnode = (VNode*)_node; - // at any rate remove the vnode from our map and delete it - MutexLocker locker(fLock); - fVNodes->Remove(vnode); - locker.Unlock(); + // At any rate remove the vnode from our map and delete it. We don't do that + // right now, though, since we might still need to serve file cache requests + // from the client FS. + VNodeRemover nodeRemover(this, vnode); void* clientNode = vnode->clientNode; - vnode->Delete(this); // get a free port RequestPort* port = fFileSystem->GetPortPool()->AcquirePort(); @@ -3731,13 +3757,12 @@ Volume::_WriteVNode(void* _node, bool reenter) { VNode* vnode = (VNode*)_node; - // at any rate remove the vnode from our map and delete it - MutexLocker locker(fLock); - fVNodes->Remove(vnode); - locker.Unlock(); + // At any rate remove the vnode from our map and delete it. We don't do that + // right now, though, since we might still need to serve file cache requests + // from the client FS. + VNodeRemover nodeRemover(this, vnode); void* clientNode = vnode->clientNode; - vnode->Delete(this); // get a free port RequestPort* port = fFileSystem->GetPortPool()->AcquirePort(); diff --git a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.h b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.h index 172d8f8a4d..542213abea 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.h +++ b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.h @@ -229,6 +229,8 @@ private: class AutoIncrementer; class IORequestRemover; friend class IORequestRemover; + class VNodeRemover; + friend class VNodeRemover; private: void _InitVolumeOps();