svn commit: r351778 - stable/12/sys/fs/unionfs
Konstantin Belousov
kib at FreeBSD.org
Tue Sep 3 19:34:33 UTC 2019
Author: kib
Date: Tue Sep 3 19:34:32 2019
New Revision: 351778
URL: https://svnweb.freebsd.org/changeset/base/351778
Log:
MFC r350504:
Try to decrease the number of bugs in unionfs after the VV_TEXT flag removal.
Modified:
stable/12/sys/fs/unionfs/union_subr.c
stable/12/sys/fs/unionfs/union_vnops.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/fs/unionfs/union_subr.c
==============================================================================
--- stable/12/sys/fs/unionfs/union_subr.c Tue Sep 3 19:30:02 2019 (r351777)
+++ stable/12/sys/fs/unionfs/union_subr.c Tue Sep 3 19:34:32 2019 (r351778)
@@ -348,6 +348,13 @@ unionfs_noderem(struct vnode *vp, struct thread *td)
vp->v_vnlock = &(vp->v_lock);
vp->v_data = NULL;
vp->v_object = NULL;
+ if (vp->v_writecount > 0) {
+ if (uvp != NULL)
+ VOP_ADD_WRITECOUNT(uvp, -vp->v_writecount);
+ else if (lvp != NULL)
+ VOP_ADD_WRITECOUNT(lvp, -vp->v_writecount);
+ } else if (vp->v_writecount < 0)
+ vp->v_writecount = 0;
VI_UNLOCK(vp);
if (lvp != NULLVP)
Modified: stable/12/sys/fs/unionfs/union_vnops.c
==============================================================================
--- stable/12/sys/fs/unionfs/union_vnops.c Tue Sep 3 19:30:02 2019 (r351777)
+++ stable/12/sys/fs/unionfs/union_vnops.c Tue Sep 3 19:34:32 2019 (r351778)
@@ -2511,6 +2511,33 @@ unionfs_vptofh(struct vop_vptofh_args *ap)
return (EOPNOTSUPP);
}
+static int
+unionfs_add_writecount(struct vop_add_writecount_args *ap)
+{
+ struct vnode *tvp, *vp;
+ struct unionfs_node *unp;
+ int error;
+
+ vp = ap->a_vp;
+ unp = VTOUNIONFS(vp);
+ tvp = unp->un_uppervp != NULL ? unp->un_uppervp : unp->un_lowervp;
+ VI_LOCK(vp);
+ /* text refs are bypassed to lowervp */
+ VNASSERT(vp->v_writecount >= 0, vp, ("wrong null writecount"));
+ VNASSERT(vp->v_writecount + ap->a_inc >= 0, vp,
+ ("wrong writecount inc %d", ap->a_inc));
+ if (tvp != NULL)
+ error = VOP_ADD_WRITECOUNT(tvp, ap->a_inc);
+ else if (vp->v_writecount < 0)
+ error = ETXTBSY;
+ else
+ error = 0;
+ if (error == 0)
+ vp->v_writecount += ap->a_inc;
+ VI_UNLOCK(vp);
+ return (error);
+}
+
struct vop_vector unionfs_vnodeops = {
.vop_default = &default_vnodeops,
@@ -2559,4 +2586,5 @@ struct vop_vector unionfs_vnodeops = {
.vop_whiteout = unionfs_whiteout,
.vop_write = unionfs_write,
.vop_vptofh = unionfs_vptofh,
+ .vop_add_writecount = unionfs_add_writecount,
};
More information about the svn-src-all
mailing list