store_acquire_unreferenced_ref() saves the pointer of the vnode it got

from the call to vfs_get_vnode() now. Only this way it is safe to call
store_release_ref() later (as the page writer does). We had a potential
race condition -- if called after vm_cache_remove_consumer() had
released the last reference, the old vnode might already have been
deleted.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24386 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2008-03-13 23:41:14 +00:00
parent 23234fa59d
commit 2b0b4bee36

View File

@ -88,7 +88,14 @@ store_acquire_unreferenced_ref(struct vm_store *_store)
{
vnode_store *store = (vnode_store *)_store;
struct vnode *vnode;
return vfs_get_vnode(store->device, store->inode, false, &vnode);
status_t status = vfs_get_vnode(store->device, store->inode, false, &vnode);
// If successful, update the store's vnode pointer, so that release_ref()
// won't use a stale pointer.
if (status == B_OK)
store->vnode = vnode;
return status;
}