aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/vfs_default.c
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2021-11-26 09:02:19 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2021-11-26 12:06:08 +0000
commit3ffcfa599e29686cf2b3c1a6087408c37acaed78 (patch)
tree9e13b26e42c468e47e3d116a4ce9bec3e18d669a /sys/kern/vfs_default.c
parentdf90aeac24c9d3621f294e6638a31499b56f4f6b (diff)
downloadsrc-3ffcfa599e29686cf2b3c1a6087408c37acaed78.tar.gz
src-3ffcfa599e29686cf2b3c1a6087408c37acaed78.zip
vfs: add vop_stdadd_writecount_nomsync
This avoids needing to inspect the mount point every time. Reviewed by: kib (previous version) Differential Revision: https://reviews.freebsd.org/D33125
Diffstat (limited to 'sys/kern/vfs_default.c')
-rw-r--r--sys/kern/vfs_default.c40
1 files changed, 32 insertions, 8 deletions
diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c
index 763e9a943f7d..50829ad3044e 100644
--- a/sys/kern/vfs_default.c
+++ b/sys/kern/vfs_default.c
@@ -1382,24 +1382,34 @@ vop_stdunset_text(struct vop_unset_text_args *ap)
return (error);
}
-static int
-vop_stdadd_writecount(struct vop_add_writecount_args *ap)
+static int __always_inline
+vop_stdadd_writecount_impl(struct vop_add_writecount_args *ap, bool handle_msync)
{
struct vnode *vp;
- struct mount *mp;
+ struct mount *mp __diagused;
int error;
vp = ap->a_vp;
+
+#ifdef INVARIANTS
+ mp = vp->v_mount;
+ if (mp != NULL) {
+ if (handle_msync) {
+ VNPASS((mp->mnt_kern_flag & MNTK_NOMSYNC) == 0, vp);
+ } else {
+ VNPASS((mp->mnt_kern_flag & MNTK_NOMSYNC) != 0, vp);
+ }
+ }
+#endif
+
VI_LOCK_FLAGS(vp, MTX_DUPOK);
- if (vp->v_writecount < 0) {
+ if (__predict_false(vp->v_writecount < 0)) {
error = ETXTBSY;
} else {
VNASSERT(vp->v_writecount + ap->a_inc >= 0, vp,
("neg writecount increment %d", ap->a_inc));
- if (vp->v_writecount == 0) {
- mp = vp->v_mount;
- if (mp != NULL && (mp->mnt_kern_flag & MNTK_NOMSYNC) == 0)
- vlazy(vp);
+ if (handle_msync && vp->v_writecount == 0) {
+ vlazy(vp);
}
vp->v_writecount += ap->a_inc;
error = 0;
@@ -1409,6 +1419,20 @@ vop_stdadd_writecount(struct vop_add_writecount_args *ap)
}
int
+vop_stdadd_writecount(struct vop_add_writecount_args *ap)
+{
+
+ return (vop_stdadd_writecount_impl(ap, true));
+}
+
+int
+vop_stdadd_writecount_nomsync(struct vop_add_writecount_args *ap)
+{
+
+ return (vop_stdadd_writecount_impl(ap, false));
+}
+
+int
vop_stdneed_inactive(struct vop_need_inactive_args *ap)
{