From b4d0d457028509a7857b3e785628de608bda5380 Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 1 May 2023 21:33:02 -0300 Subject: [PATCH] tmpfs: handle devices on open --- kernel-src/fs/tmpfs.c | 19 ++++++++++++++++++- kernel-src/include/kernel/devfs.h | 2 ++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/kernel-src/fs/tmpfs.c b/kernel-src/fs/tmpfs.c index 5bd00272..3215dbfe 100644 --- a/kernel-src/fs/tmpfs.c +++ b/kernel-src/fs/tmpfs.c @@ -7,6 +7,7 @@ #include #include #include +#include static scache_t *nodecache; static tmpfsnode_t *newnode(vfs_t *vfs, int type); @@ -180,7 +181,23 @@ static int tmpfs_create(vnode_t *parent, char *name, vattr_t *attr, int type, vn return error; } -static int tmpfs_open(vnode_t **node, int flag, cred_t *cred) { +static int tmpfs_open(vnode_t **nodep, int flag, cred_t *cred) { + vnode_t *node = *nodep; + tmpfsnode_t *tmpnode = (tmpfsnode_t *)node; + + if (node->type == V_TYPE_CHDEV || node->type == V_TYPE_BLKDEV) { + vnode_t *devnode; + int err = devfs_getnode(node, tmpnode->attr.rdevmajor, tmpnode->attr.rdevminor, &devnode); + if (err) + return err; + + VOP_UNLOCK(node); + VOP_RELEASE(node); + VOP_HOLD(devnode); + VOP_LOCK(devnode); + *nodep = devnode; + } + return 0; } diff --git a/kernel-src/include/kernel/devfs.h b/kernel-src/include/kernel/devfs.h index 9c39044e..347d9f8a 100644 --- a/kernel-src/include/kernel/devfs.h +++ b/kernel-src/include/kernel/devfs.h @@ -20,5 +20,7 @@ typedef struct devnode_t { } 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); #endif