From a24be5cbc5231df3b4a6484df743426188535eb8 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 11 Aug 2024 13:06:46 -0300 Subject: [PATCH] fs: binding of pipes to vnodes --- kernel-src/fs/ext2.c | 18 +++++++++++++++--- kernel-src/fs/pipefs.c | 17 +++++++++++++++++ kernel-src/fs/tmpfs.c | 19 +++++++++++++++---- kernel-src/include/kernel/pipefs.h | 1 + kernel-src/include/kernel/vfs.h | 6 +++++- 5 files changed, 53 insertions(+), 8 deletions(-) diff --git a/kernel-src/fs/ext2.c b/kernel-src/fs/ext2.c index 8c698eed..1fa7e432 100644 --- a/kernel-src/fs/ext2.c +++ b/kernel-src/fs/ext2.c @@ -10,6 +10,7 @@ #include #include #include +#include #define INODE_ROOT 2 @@ -1052,9 +1053,20 @@ static void freeinode(ext2fs_t *fs, inode_t *inode, int id) { static int ext2_open(vnode_t **vnodep, int flags, cred_t *cred) { vnode_t *vnode = *vnodep; int type = vnode->type; - // TODO these types of files - __assert(type == V_TYPE_REGULAR || type == V_TYPE_DIR || type == V_TYPE_LINK); - return 0; + // TODO device files + __assert(type == V_TYPE_REGULAR || type == V_TYPE_DIR || type == V_TYPE_LINK || type == V_TYPE_FIFO); + + int error = 0; + if (type == V_TYPE_FIFO) { + VOP_LOCK(*vnodep); + vnode_t *fifo; + error = pipefs_getbinding(*vnodep, &fifo); + VOP_UNLOCK(*vnodep); + if (error == 0) + *vnodep = fifo; + } + + return error; } static int ext2_close(vnode_t *vnode, int flags, cred_t *cred) { diff --git a/kernel-src/fs/pipefs.c b/kernel-src/fs/pipefs.c index 20f9a152..3ee3404e 100644 --- a/kernel-src/fs/pipefs.c +++ b/kernel-src/fs/pipefs.c @@ -399,3 +399,20 @@ int pipefs_newpipe(vnode_t **nodep) { return 0; } + +// assumes node is locked upon calling +int pipefs_getbinding(vnode_t *node, vnode_t **pipep) { + __assert(node->type == V_TYPE_FIFO); + + if (node->fifobinding) { + *pipep = node->fifobinding; + return 0; + } + + int error = pipefs_newpipe(pipep); + if (error) + return error; + + node->fifobinding = *pipep; + return error; +} diff --git a/kernel-src/fs/tmpfs.c b/kernel-src/fs/tmpfs.c index 96a91301..ab86d9bb 100644 --- a/kernel-src/fs/tmpfs.c +++ b/kernel-src/fs/tmpfs.c @@ -13,6 +13,7 @@ #include #include #include +#include static scache_t *nodecache; static tmpfsnode_t *newnode(vfs_t *vfs, int type); @@ -158,18 +159,28 @@ static int tmpfs_open(vnode_t **nodep, int flag, cred_t *cred) { vnode_t *node = *nodep; tmpfsnode_t *tmpnode = (tmpfsnode_t *)node; + int error = 0; 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; + error = devfs_getnode(node, tmpnode->attr.rdevmajor, tmpnode->attr.rdevminor, &devnode); + if (error) + return error; VOP_RELEASE(node); VOP_HOLD(devnode); *nodep = devnode; } - return 0; + if (node->type == V_TYPE_FIFO) { + VOP_LOCK(*nodep); + vnode_t *fifo; + error = pipefs_getbinding(*nodep, &fifo); + VOP_UNLOCK(*nodep); + if (error == 0) + *nodep = fifo; + } + + return error; } static int tmpfs_close(vnode_t *node, int flag, cred_t *cred) { diff --git a/kernel-src/include/kernel/pipefs.h b/kernel-src/include/kernel/pipefs.h index 8dc1c106..8902ed08 100644 --- a/kernel-src/include/kernel/pipefs.h +++ b/kernel-src/include/kernel/pipefs.h @@ -18,5 +18,6 @@ typedef struct pipenode_t { void pipefs_init(); int pipefs_newpipe(vnode_t **nodep); +int pipefs_getbinding(vnode_t *node, vnode_t **pipep); #endif diff --git a/kernel-src/include/kernel/vfs.h b/kernel-src/include/kernel/vfs.h index 96fd9b74..ce60f419 100644 --- a/kernel-src/include/kernel/vfs.h +++ b/kernel-src/include/kernel/vfs.h @@ -78,7 +78,11 @@ typedef struct vnode_t { int type; vfs_t *vfs; vfs_t *vfsmounted; - void *socketbinding; + union { + void *socketbinding; + void *fifobinding; + }; + struct page_t *pages; } vnode_t;