aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/vfs_default.c
diff options
context:
space:
mode:
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)
{