From c4968741e2a664f498288b5140359def37b14f3f Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Mon, 20 Oct 2025 22:25:42 -0400 Subject: kern: devfs: Expose devfs read callback This commit makes devfs character device entries readable via its read callback. Signed-off-by: Ian Moffett --- src/sys/fs/devfs.c | 52 +++++++++++++++++++++++++++++++++++++++++++++- src/sys/include/fs/devfs.h | 1 + 2 files changed, 52 insertions(+), 1 deletion(-) (limited to 'src/sys') diff --git a/src/sys/fs/devfs.c b/src/sys/fs/devfs.c index 08a9fc5..0e6b8ef 100644 --- a/src/sys/fs/devfs.c +++ b/src/sys/fs/devfs.c @@ -78,6 +78,7 @@ devfs_lookup(struct vop_lookup_args *args) } vp->data = dnp; + vp->vops = &devfs_vops; *args->vpp = vp; return 0; } @@ -116,12 +117,60 @@ devfs_register(const char *name, dev_type_t type, void *devsw, int flags) break; } + dnp->dev = devsw; devname_len = strlen(name); memcpy(dnp->name, name, devname_len); TAILQ_INSERT_TAIL(&nodelist, dnp, link); return 0; } +/* + * Read a character device + */ +static int +devfs_cdev_read(struct devfs_node *dnp, struct dev_iobuf *iobuf, int flags) +{ + struct cdevsw *cdev; + + if (dnp == NULL || iobuf == NULL) { + return -EINVAL; + } + + if ((cdev = dnp->cdev) == NULL) { + return -EIO; + } + + return cdev->read(dnp, iobuf, flags); +} + +/* + * VFS read callback for devfs + */ +static ssize_t +devfs_read(struct vop_rw_data *args) +{ + struct vnode *vp; + struct devfs_node *dnp; + struct dev_iobuf iobuf; + + if ((vp = args->vp) == NULL) { + return -EIO; + } + + if ((dnp = vp->data) == NULL) { + return -EIO; + } + + iobuf.buf = args->data; + iobuf.count = args->len; + iobuf.off = args->off; + if (dnp->type == DEVFS_CDEV) { + return devfs_cdev_read(dnp, &iobuf, 0); + } + + return -EIO; +} + /* * Initialize the device filesystem */ @@ -157,7 +206,8 @@ devfs_mount(struct fs_info *fip, struct mount_args *margs) } static struct vop devfs_vops = { - .lookup = devfs_lookup + .lookup = devfs_lookup, + .read = devfs_read }; struct vfsops g_devfs_vfsops = { diff --git a/src/sys/include/fs/devfs.h b/src/sys/include/fs/devfs.h index ea96cdd..68c910f 100644 --- a/src/sys/include/fs/devfs.h +++ b/src/sys/include/fs/devfs.h @@ -45,6 +45,7 @@ struct devfs_node; struct dev_iobuf { void *buf; size_t count; + off_t off; }; /* -- cgit v1.2.3