devfs: getbyname()

This commit is contained in:
Matheus
2023-07-25 18:45:10 -03:00
parent 9d1beb2807
commit 6653b01e23
3 changed files with 32 additions and 8 deletions
+27 -8
View File
@@ -9,7 +9,7 @@
static devnode_t *devfsroot;
static spinlock_t tablelock;
static mutex_t tablelock;
static hashtable_t devtable;
static hashtable_t nametable;
@@ -94,7 +94,9 @@ int devfs_lookup(vnode_t *node, char *name, vnode_t **result, cred_t *cred) {
void *v;
VOP_LOCK(node);
MUTEX_ACQUIRE(&tablelock, false);
int error = hashtable_get(&nametable, &v, name, strlen(name));
MUTEX_RELEASE(&tablelock);
if (error) {
VOP_UNLOCK(node);
return error;
@@ -339,7 +341,7 @@ void devfs_init() {
__assert(hashtable_init(&devtable, 50) == 0);
__assert(hashtable_init(&nametable, 50) == 0);
nodecache = slab_newcache(sizeof(devnode_t), 0, ctor, ctor);
SPINLOCK_INIT(tablelock);
MUTEX_INIT(&tablelock);
__assert(nodecache);
devfsroot = slab_allocate(nodecache);
@@ -350,6 +352,23 @@ void devfs_init() {
__assert(hashtable_set(&nametable, devfsroot, ".", 1, true) == 0);
}
int devfs_getbyname(char *name, vnode_t **ret) {
void *v;
MUTEX_ACQUIRE(&tablelock, false);
int error = hashtable_get(&nametable, &v, name, strlen(name));
if (error)
goto cleanup;
vnode_t *node = v;
VOP_HOLD(node);
*ret = node;
cleanup:
MUTEX_RELEASE(&tablelock);
return error;
}
// register new device
int devfs_register(devops_t *devops, char *name, int type, int major, int minor, mode_t mode) {
__assert(type == V_TYPE_CHDEV || type == V_TYPE_BLKDEV);
@@ -361,9 +380,9 @@ int devfs_register(devops_t *devops, char *name, int type, int major, int minor,
int key[2] = {major, minor};
spinlock_acquire(&tablelock);
MUTEX_ACQUIRE(&tablelock, false);
int error = hashtable_set(&devtable, master, key, sizeof(key), true);
spinlock_release(&tablelock);
MUTEX_RELEASE(&tablelock);
if (error) {
slab_free(nodecache, master);
return error;
@@ -378,9 +397,9 @@ int devfs_register(devops_t *devops, char *name, int type, int major, int minor,
error = vfs_create((vnode_t *)devfsroot, name, &attr, type, &newvnode);
if (error) {
spinlock_acquire(&tablelock);
MUTEX_ACQUIRE(&tablelock, false);
__assert(hashtable_remove(&devtable, key, sizeof(key) == 0));
spinlock_release(&tablelock);
MUTEX_RELEASE(&tablelock);
slab_free(nodecache, master);
return error;
}
@@ -396,10 +415,10 @@ int devfs_register(devops_t *devops, char *name, int type, int major, int minor,
// allocate a pointer node to the master node associated with device major and minor
int devfs_getnode(vnode_t *physical, int major, int minor, vnode_t **node) {
int key[2] = {major, minor};
spinlock_acquire(&tablelock);
MUTEX_ACQUIRE(&tablelock, false);
void *r;
int err = hashtable_get(&devtable, &r, key, sizeof(key));
spinlock_release(&tablelock);
MUTEX_RELEASE(&tablelock);
if (err)
return err == ENOENT ? ENXIO : err;
+4
View File
@@ -84,6 +84,7 @@ static int tmpfs_getattr(vnode_t *node, vattr_t *attr, cred_t *cred) {
VOP_LOCK(node);
tmpfsnode_t *tmpnode = (tmpfsnode_t *)node;
*attr = tmpnode->attr;
attr->blocksused = node->type == V_TYPE_DIR ? 1 : tmpnode->pagecount;
VOP_UNLOCK(node);
return 0;
}
@@ -315,6 +316,9 @@ static int tmpfs_unlink(vnode_t *node, char *name, cred_t *cred) {
}
static int tmpfs_link(vnode_t *node, vnode_t *dir, char *name, cred_t *cred) {
if (node->vfs != dir->vfs)
return EXDEV;
if (dir->type != V_TYPE_DIR)
return ENOTDIR;
+1
View File
@@ -36,5 +36,6 @@ typedef struct devnode_t {
void devfs_init();
int devfs_getnode(vnode_t *physical, int major, int minor, vnode_t **node);
int devfs_register(devops_t *devops, char *name, int type, int major, int minor, mode_t mode);
int devfs_getbyname(char *name, vnode_t **ret);
#endif