Index: sys/fs/unionfs/union_subr.c =================================================================== --- sys/fs/unionfs/union_subr.c +++ sys/fs/unionfs/union_subr.c @@ -454,13 +454,6 @@ 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; if (unp->un_hashtbl != NULL) { /* * Clear out any cached child vnodes. This should only Index: sys/fs/unionfs/union_vnops.c =================================================================== --- sys/fs/unionfs/union_vnops.c +++ sys/fs/unionfs/union_vnops.c @@ -2528,20 +2528,7 @@ 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); + error = VOP_ADD_WRITECOUNT(tvp, ap->a_inc); return (error); } @@ -2667,6 +2654,33 @@ return (res); } +static int +unionfs_set_text(struct vop_set_text_args *ap) +{ + struct vnode *tvp; + struct unionfs_node *unp; + int error; + + unp = VTOUNIONFS(ap->a_vp); + ASSERT_VOP_LOCKED(ap->a_vp, __func__); + tvp = unp->un_uppervp != NULL ? unp->un_uppervp : unp->un_lowervp; + error = VOP_SET_TEXT(tvp); + return (error); +} + +static int +unionfs_unset_text(struct vop_unset_text_args *ap) +{ + struct vnode *tvp; + struct unionfs_node *unp; + + ASSERT_VOP_LOCKED(ap->a_vp, __func__); + unp = VTOUNIONFS(ap->a_vp); + tvp = unp->un_uppervp != NULL ? unp->un_uppervp : unp->un_lowervp; + VOP_UNSET_TEXT_CHECKED(tvp); + return (0); +} + struct vop_vector unionfs_vnodeops = { .vop_default = &default_vnodeops, @@ -2718,5 +2732,7 @@ .vop_vptofh = unionfs_vptofh, .vop_add_writecount = unionfs_add_writecount, .vop_vput_pair = unionfs_vput_pair, + .vop_set_text = unionfs_set_text, + .vop_unset_text = unionfs_unset_text, }; VFS_VOP_VECTOR_REGISTER(unionfs_vnodeops);