From 9a4ec7539041f9ff25b947b2716aded028c0291f Mon Sep 17 00:00:00 2001
From: Ian Moffett <ian@osmora.org>
Date: Tue, 21 May 2024 22:15:27 -0400
Subject: kernel: vfs: Add support for close VOP

Signed-off-by: Ian Moffett <ian@osmora.org>
---
 sys/include/sys/vfs.h    | 1 +
 sys/include/sys/vnode.h  | 1 +
 sys/kern/kern_filedesc.c | 4 ++++
 sys/kern/vfs_subr.c      | 9 +++++++++
 4 files changed, 15 insertions(+)

diff --git a/sys/include/sys/vfs.h b/sys/include/sys/vfs.h
index 98aef3f..1f7e423 100644
--- a/sys/include/sys/vfs.h
+++ b/sys/include/sys/vfs.h
@@ -60,6 +60,7 @@ ssize_t vfs_write(struct vnode *vp, struct sio_txn *sio);
 int vfs_getattr(struct vnode *vp, struct vattr *vattr);
 int vfs_open(struct vnode *vp);
 
+int vfs_close(struct vnode *vp);
 uint64_t sys_mount(struct syscall_args *args);
 
 #endif /* defined(_KERNEL) */
diff --git a/sys/include/sys/vnode.h b/sys/include/sys/vnode.h
index 71fc5c2..8201f94 100644
--- a/sys/include/sys/vnode.h
+++ b/sys/include/sys/vnode.h
@@ -45,6 +45,7 @@ struct vops {
     int(*write)(struct vnode *vp, struct sio_txn *sio);
     int(*getattr)(struct vnode *vp, struct vattr *vattr);
     int(*open)(struct vnode *vp);
+    int(*close)(struct vnode *vp);
 };
 
 struct vattr {
diff --git a/sys/kern/kern_filedesc.c b/sys/kern/kern_filedesc.c
index 74ab859..ec0aee7 100644
--- a/sys/kern/kern_filedesc.c
+++ b/sys/kern/kern_filedesc.c
@@ -211,6 +211,10 @@ fd_close_fdnum(struct proc *td, int fdno)
         return;
     }
 
+    if (fd->vnode != NULL) {
+        vfs_close(fd->vnode);
+    }
+
     dynfree(fd);
     td->fds[fdno] = NULL;
 }
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index f760831..60afa31 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -247,3 +247,12 @@ int vfs_open(struct vnode *vp)
 
     return vp->vops->open(vp);
 }
+
+int
+vfs_close(struct vnode *vp)
+{
+    if (vp->vops->close == NULL)
+        return -EIO;
+
+    return vp->vops->close(vp);
+}
-- 
cgit v1.2.3