summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/sys/include/os/vnode.h5
-rw-r--r--src/sys/os/vfs_subr.c5
2 files changed, 10 insertions, 0 deletions
diff --git a/src/sys/include/os/vnode.h b/src/sys/include/os/vnode.h
index ed98206..354c73c 100644
--- a/src/sys/include/os/vnode.h
+++ b/src/sys/include/os/vnode.h
@@ -31,6 +31,7 @@
#define _OS_VNODE_H_ 1
#include <sys/types.h>
+#include <sys/atomic.h>
/* Forward declarations */
struct vnode;
@@ -82,16 +83,20 @@ struct vop {
* [V] Set up by VFS
* [F/V]: Both F and V
*
+ * @refcount: How many objects have a reference
* @type: Vnode type [F/V]
* @vops: Vnode operations hooks [F]
* @data: Filesystem specific data [F]
*/
struct vnode {
+ int refcount;
vtype_t type;
struct vop *vops;
void *data;
};
+#define vnode_ref(VP) (atomic_inc_int(&(VP)->refcount))
+
/*
* Allocate a new vnode
*
diff --git a/src/sys/os/vfs_subr.c b/src/sys/os/vfs_subr.c
index 6cb542c..64c7492 100644
--- a/src/sys/os/vfs_subr.c
+++ b/src/sys/os/vfs_subr.c
@@ -29,6 +29,7 @@
#include <sys/types.h>
#include <sys/errno.h>
+#include <sys/atomic.h>
#include <os/vnode.h>
#include <os/kalloc.h>
#include <os/vfs.h>
@@ -77,6 +78,7 @@ vfs_valloc(struct vnode **resp, vtype_t type, int flags)
}
memset(vp, 0, sizeof(*vp));
+ vp->refcount = 1;
vp->type = type;
*resp = vp;
return 0;
@@ -89,6 +91,9 @@ vfs_vrel(struct vnode *vp, int flags)
return -EINVAL;
}
+ if (atomic_dec_int(&vp->refcount) > 1) {
+ return 0;
+ }
kfree(vp);
return 0;
}