From bb5c46d645add4d1e344425572b9a951290f4c85 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 6 May 2023 18:01:27 -0300 Subject: [PATCH] devfs: handle devices not supporting certain operations --- kernel-src/fs/devfs.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/kernel-src/fs/devfs.c b/kernel-src/fs/devfs.c index 99099d06..46697330 100644 --- a/kernel-src/fs/devfs.c +++ b/kernel-src/fs/devfs.c @@ -41,6 +41,9 @@ int devfs_open(vnode_t **node, int flags, cred_t *cred) { if (devnode->master) devnode = devnode->master; + if (devnode->devops->open == NULL) + return ENODEV; + return devnode->devops->open(devnode->attr.rdevminor, flags); } @@ -49,6 +52,9 @@ int devfs_close(vnode_t *node, int flags, cred_t *cred) { if (devnode->master) devnode = devnode->master; + if (devnode->devops->close == NULL) + return ENODEV; + return devnode->devops->close(devnode->attr.rdevminor, flags); } @@ -57,6 +63,9 @@ int devfs_read(vnode_t *node, void *buffer, size_t size, uintmax_t offset, int f if (devnode->master) devnode = devnode->master; + if (devnode->devops->read == NULL) + return ENODEV; + return devnode->devops->read(devnode->attr.rdevminor, buffer, size, offset, flags, readc); } @@ -65,6 +74,9 @@ int devfs_write(vnode_t *node, void *buffer, size_t size, uintmax_t offset, int if (devnode->master) devnode = devnode->master; + if (devnode->devops->write == NULL) + return ENODEV; + return devnode->devops->write(devnode->attr.rdevminor, buffer, size, offset, flags, writec); } @@ -124,6 +136,9 @@ int devfs_poll(vnode_t *node, int events) { if (devnode->master) devnode = devnode->master; + if (devnode->devops->poll == NULL) + return ENODEV; + return devnode->devops->poll(devnode->attr.rdevminor, events); } @@ -132,6 +147,9 @@ int devfs_mmap(vnode_t *node, void *addr, uintmax_t offset, int flags, cred_t *c if (devnode->master) devnode = devnode->master; + if (devnode->devops->mmap == NULL) + return ENODEV; + return devnode->devops->mmap(devnode->attr.rdevminor, addr, offset, flags); } @@ -140,6 +158,9 @@ int devfs_munmap(vnode_t *node, void *addr, uintmax_t offset, int flags, cred_t if (devnode->master) devnode = devnode->master; + if (devnode->devops->munmap == NULL) + return ENODEV; + return devnode->devops->munmap(devnode->attr.rdevminor, addr, offset, flags); }