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();