devfs: migrate to BOpenHashTable

For #9552.
This commit is contained in:
Adrien Destugues 2015-01-09 16:22:15 +01:00
parent 6f05b191d7
commit 6a89f8040f

View File

@ -33,7 +33,6 @@
#include <lock.h>
#include <Notifications.h>
#include <util/AutoLock.h>
#include <util/khash.h>
#include <vfs.h>
#include <vm/vm.h>
@ -99,12 +98,40 @@ struct devfs_vnode {
#define DEVFS_HASH_SIZE 16
struct NodeHash {
typedef ino_t KeyType;
typedef devfs_vnode ValueType;
size_t HashKey(KeyType key) const
{
return key ^ (key >> 32);
}
size_t Hash(ValueType* value) const
{
return HashKey(value->id);
}
bool Compare(KeyType key, ValueType* value) const
{
return value->id == key;
}
ValueType*& GetLink(ValueType* value) const
{
return value->all_next;
}
};
typedef BOpenHashTable<NodeHash> NodeTable;
struct devfs {
dev_t id;
fs_volume* volume;
recursive_lock lock;
int32 next_vnode_id;
hash_table* vnode_hash;
int32 next_vnode_id;
NodeTable* vnode_hash;
struct devfs_vnode* root_vnode;
};
@ -208,32 +235,6 @@ scan_for_drivers_if_needed(devfs_vnode* dir)
}
static uint32
devfs_vnode_hash(void* _vnode, const void* _key, uint32 range)
{
struct devfs_vnode* vnode = (struct devfs_vnode*)_vnode;
const ino_t* key = (const ino_t*)_key;
if (vnode != NULL)
return vnode->id % range;
return (uint64)*key % range;
}
static int
devfs_vnode_compare(void* _vnode, const void* _key)
{
struct devfs_vnode* vnode = (struct devfs_vnode*)_vnode;
const ino_t* key = (const ino_t*)_key;
if (vnode->id == *key)
return 0;
return -1;
}
static void
init_directory_vnode(struct devfs_vnode* vnode, int permissions)
{
@ -283,7 +284,7 @@ devfs_delete_vnode(struct devfs* fs, struct devfs_vnode* vnode,
return B_NOT_ALLOWED;
// remove it from the global hash table
hash_remove(fs->vnode_hash, vnode);
fs->vnode_hash->Remove(vnode);
if (S_ISCHR(vnode->stream.type)) {
if (vnode->stream.u.dev.partition == NULL) {
@ -465,7 +466,7 @@ add_partition(struct devfs* fs, struct devfs_vnode* device, const char* name,
partitionNode->stream.u.dev.device = device->stream.u.dev.device;
partitionNode->stream.u.dev.partition = partition;
hash_insert(fs->vnode_hash, partitionNode);
fs->vnode_hash->Insert(partitionNode);
devfs_insert_in_dir(device->parent, partitionNode);
TRACE(("add_partition(name = %s, offset = %Ld, size = %Ld)\n",
@ -536,7 +537,7 @@ out:
static void
publish_node(devfs* fs, devfs_vnode* dirNode, struct devfs_vnode* node)
{
hash_insert(fs->vnode_hash, node);
fs->vnode_hash->Insert(node);
devfs_insert_in_dir(dirNode, node);
}
@ -896,10 +897,8 @@ devfs_mount(fs_volume* volume, const char* devfs, uint32 flags,
recursive_lock_init(&fs->lock, "devfs lock");
fs->vnode_hash = hash_init(DEVFS_HASH_SIZE, offsetof(devfs_vnode, all_next),
//(addr_t)&vnode->all_next - (addr_t)vnode,
&devfs_vnode_compare, &devfs_vnode_hash);
if (fs->vnode_hash == NULL) {
fs->vnode_hash = new NodeTable();
if (fs->vnode_hash == NULL || fs->vnode_hash->Init(DEVFS_HASH_SIZE) != B_OK) {
err = B_NO_MEMORY;
goto err2;
}
@ -918,7 +917,7 @@ devfs_mount(fs_volume* volume, const char* devfs, uint32 flags,
init_directory_vnode(vnode, 0755);
fs->root_vnode = vnode;
hash_insert(fs->vnode_hash, vnode);
fs->vnode_hash->Insert(vnode);
publish_vnode(volume, vnode->id, vnode, &kVnodeOps, vnode->stream.type, 0);
*_rootNodeID = vnode->id;
@ -926,7 +925,7 @@ devfs_mount(fs_volume* volume, const char* devfs, uint32 flags,
return B_OK;
err3:
hash_uninit(fs->vnode_hash);
delete fs->vnode_hash;
err2:
recursive_lock_destroy(&fs->lock);
free(fs);
@ -940,7 +939,6 @@ devfs_unmount(fs_volume* _volume)
{
struct devfs* fs = (struct devfs*)_volume->private_volume;
struct devfs_vnode* vnode;
struct hash_iterator i;
TRACE(("devfs_unmount: entry fs = %p\n", fs));
@ -950,12 +948,12 @@ devfs_unmount(fs_volume* _volume)
put_vnode(fs->volume, fs->root_vnode->id);
// delete all of the vnodes
hash_open(fs->vnode_hash, &i);
while ((vnode = (devfs_vnode*)hash_next(fs->vnode_hash, &i)) != NULL) {
NodeTable::Iterator i(fs->vnode_hash);
while (i.HasNext()) {
vnode = i.Next();
devfs_delete_vnode(fs, vnode, true);
}
hash_close(fs->vnode_hash, &i, false);
hash_uninit(fs->vnode_hash);
delete fs->vnode_hash;
recursive_lock_destroy(&fs->lock);
free(fs);
@ -1032,7 +1030,7 @@ devfs_get_vnode(fs_volume* _volume, ino_t id, fs_vnode* _vnode, int* _type,
RecursiveLocker _(fs->lock);
struct devfs_vnode* vnode = (devfs_vnode*)hash_lookup(fs->vnode_hash, &id);
struct devfs_vnode* vnode = fs->vnode_hash->Lookup(id);
if (vnode == NULL)
return B_ENTRY_NOT_FOUND;