diff --git a/kernel-src/fs/devfs.c b/kernel-src/fs/devfs.c index 20a09990..2cb0cfd4 100644 --- a/kernel-src/fs/devfs.c +++ b/kernel-src/fs/devfs.c @@ -38,7 +38,7 @@ static int devfs_root(vfs_t *vfs, vnode_t **node) { int devfs_open(vnode_t **node, int flags, cred_t *cred) { devnode_t *devnode = (devnode_t *)(*node); - if (devnode->devops == NULL) + if ((*node)->type != V_TYPE_CHDEV && (*node)->type != V_TYPE_BLKDEV) return 0; if (devnode->master) @@ -47,13 +47,13 @@ int devfs_open(vnode_t **node, int flags, cred_t *cred) { if (devnode->devops->open == NULL) return 0; - return devnode->devops->open(devnode->attr.rdevminor, flags); + return devnode->devops->open(devnode->attr.rdevminor, node, flags); } int devfs_close(vnode_t *node, int flags, cred_t *cred) { devnode_t *devnode = (devnode_t *)node; - if (devnode->devops == NULL) + if (node->type != V_TYPE_CHDEV && node->type != V_TYPE_BLKDEV) return 0; if (devnode->master) @@ -435,6 +435,7 @@ int devfs_register(devops_t *devops, char *name, int type, int major, int minor, devnode_t *newdevnode = (devnode_t *)newvnode; master->attr = newdevnode->attr; + master->vnode.type = type; newdevnode->master = master; return 0; @@ -451,15 +452,18 @@ int devfs_getnode(vnode_t *physical, int major, int minor, vnode_t **node) { return err == ENOENT ? ENXIO : err; devnode_t *newnode = slab_allocate(nodecache); - if (newnode) + if (newnode == NULL) return ENOMEM; devnode_t *master = r; newnode->master = master; VOP_HOLD(&master->vnode); - newnode->physical = physical; - VOP_HOLD(physical); + if (physical) { + newnode->physical = physical; + VOP_HOLD(physical); + } *node = &newnode->vnode; + newnode->vnode.type = master->vnode.type; return 0; } diff --git a/kernel-src/include/kernel/devfs.h b/kernel-src/include/kernel/devfs.h index 8cf42393..0488a60d 100644 --- a/kernel-src/include/kernel/devfs.h +++ b/kernel-src/include/kernel/devfs.h @@ -17,10 +17,9 @@ #define DEV_MAJOR_URANDOM 9 #define DEV_MAJOR_NET 10 #define DEV_MAJOR_MOUSE 11 -#define DEV_MAJOR_CONSOLE 12 typedef struct { - int (*open)(int minor, int flags); + int (*open)(int minor, vnode_t **vnode, int flags); int (*close)(int minor, int flags); int (*read)(int minor, void *buffer, size_t size, uintmax_t offset, int flags, size_t *readc); int (*write)(int minor, void *buffer, size_t size, uintmax_t offset, int flags, size_t *writec);