summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_subr.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/vfs_subr.c')
-rw-r--r--sys/kern/vfs_subr.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index cf701c6..d9813e3 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -2571,11 +2571,34 @@ void
vrefl(struct vnode *vp)
{
+ ASSERT_VI_LOCKED(vp, __func__);
CTR2(KTR_VFS, "%s: vp %p", __func__, vp);
_vhold(vp, true);
v_incr_usecount_locked(vp);
}
+void
+vrefact(struct vnode *vp)
+{
+
+ CTR2(KTR_VFS, "%s: vp %p", __func__, vp);
+ if (__predict_false(vp->v_type == VCHR)) {
+ VNASSERT(vp->v_holdcnt > 0 && vp->v_usecount > 0, vp,
+ ("%s: wrong ref counts", __func__));
+ vref(vp);
+ return;
+ }
+#ifdef INVARIANTS
+ int old = atomic_fetchadd_int(&vp->v_holdcnt, 1);
+ VNASSERT(old > 0, vp, ("%s: wrong hold count", __func__));
+ old = atomic_fetchadd_int(&vp->v_usecount, 1);
+ VNASSERT(old > 0, vp, ("%s: wrong use count", __func__));
+#else
+ refcount_acquire(&vp->v_holdcnt);
+ refcount_acquire(&vp->v_usecount);
+#endif
+}
+
/*
* Return reference count of a vnode.
*
OpenPOWER on IntegriCloud