devfs: fixes and change behaviour of open

This commit is contained in:
Matheus
2024-05-01 21:39:56 -03:00
parent 5da946e0bd
commit 1f848fe596
2 changed files with 11 additions and 8 deletions
+10 -6
View File
@@ -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;
}
+1 -2
View File
@@ -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);