Changed the way the vnode cache is set - it's now cleaner and can no longer
allocate a cache twice. The VFS is now responsible for allocating the cache object - it will call the VM to do that if necessary. Added another accessor call to a pointer to the VFS private vnode object. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8817 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
2f1cbcf862
commit
4872592920
|
@ -530,7 +530,7 @@ dec_vnode_ref_count(struct vnode *vnode, bool reenter)
|
||||||
if (vnode->cache)
|
if (vnode->cache)
|
||||||
vm_cache_release_ref((vm_cache_ref *)vnode->cache);
|
vm_cache_release_ref((vm_cache_ref *)vnode->cache);
|
||||||
vnode->cache = NULL;
|
vnode->cache = NULL;
|
||||||
|
|
||||||
if (vnode->delete_me)
|
if (vnode->delete_me)
|
||||||
FS_CALL(vnode, remove_vnode)(vnode->mount->cookie, vnode->private_node, reenter);
|
FS_CALL(vnode, remove_vnode)(vnode->mount->cookie, vnode->private_node, reenter);
|
||||||
else
|
else
|
||||||
|
@ -1417,24 +1417,30 @@ vfs_vnode_release_ref(void *vnode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void *
|
extern "C" status_t
|
||||||
vfs_get_cache_ptr(void *vnode)
|
vfs_get_vnode_cache(void *_vnode, void **_cache)
|
||||||
{
|
{
|
||||||
return ((struct vnode *)vnode)->cache;
|
struct vnode *vnode = (struct vnode *)_vnode;
|
||||||
|
|
||||||
|
if (vnode->cache != NULL)
|
||||||
|
return B_OK;
|
||||||
|
|
||||||
|
mutex_lock(&sVnodeMutex);
|
||||||
|
|
||||||
|
status_t status = B_OK;
|
||||||
|
// The cache could have been created in the meantime
|
||||||
|
if (vnode->cache == NULL)
|
||||||
|
status = vm_create_vnode_cache(vnode, (void **)&vnode->cache);
|
||||||
|
else
|
||||||
|
*_cache = vnode->cache;
|
||||||
|
|
||||||
|
mutex_unlock(&sVnodeMutex);
|
||||||
|
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
extern "C" int
|
||||||
vfs_set_cache_ptr(void *vnode, void *cache)
|
|
||||||
{
|
|
||||||
if (atomic_test_and_set((int32 *)&(((struct vnode *)vnode)->cache), (int32)cache, 0) == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
vfs_get_vnode_from_fd(int fd, bool kernel, void **vnode)
|
vfs_get_vnode_from_fd(int fd, bool kernel, void **vnode)
|
||||||
{
|
{
|
||||||
*vnode = get_vnode_from_fd(fd, kernel);
|
*vnode = get_vnode_from_fd(fd, kernel);
|
||||||
|
@ -1446,7 +1452,7 @@ vfs_get_vnode_from_fd(int fd, bool kernel, void **vnode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
extern "C" status_t
|
||||||
vfs_get_vnode_from_path(const char *path, bool kernel, void **_vnode)
|
vfs_get_vnode_from_path(const char *path, bool kernel, void **_vnode)
|
||||||
{
|
{
|
||||||
struct vnode *vnode;
|
struct vnode *vnode;
|
||||||
|
@ -1466,6 +1472,13 @@ vfs_get_vnode_from_path(const char *path, bool kernel, void **_vnode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" status_t
|
||||||
|
vfs_get_vnode(mount_id mountID, vnode_id vnodeID, void **_vnode)
|
||||||
|
{
|
||||||
|
return get_vnode(mountID, vnodeID, (struct vnode **)_vnode, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
vfs_get_module_path(const char *basePath, const char *moduleName, char *pathBuffer,
|
vfs_get_module_path(const char *basePath, const char *moduleName, char *pathBuffer,
|
||||||
size_t bufferSize)
|
size_t bufferSize)
|
||||||
|
|
Loading…
Reference in New Issue