From 15a86f7ed0259ff7145035b659103b9f53a58b22 Mon Sep 17 00:00:00 2001 From: Jan-Simon Pendry Date: Tue, 8 Feb 1994 05:35:18 -0800 Subject: [PATCH] checkpoint SCCS-vsn: sys/miscfs/union/union.h 1.8 SCCS-vsn: sys/miscfs/union/union_subr.c 1.8 SCCS-vsn: sys/miscfs/union/union_vnops.c 1.8 SCCS-vsn: sys/miscfs/union/union_vfsops.c 1.8 --- usr/src/sys/miscfs/union/union.h | 5 ++++- usr/src/sys/miscfs/union/union_subr.c | 22 +++++++++++++++++++--- usr/src/sys/miscfs/union/union_vfsops.c | 2 +- usr/src/sys/miscfs/union/union_vnops.c | 10 +++++++--- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/usr/src/sys/miscfs/union/union.h b/usr/src/sys/miscfs/union/union.h index f989af6587..c8172a7086 100644 --- a/usr/src/sys/miscfs/union/union.h +++ b/usr/src/sys/miscfs/union/union.h @@ -8,7 +8,7 @@ * * %sccs.include.redist.c% * - * @(#)union.h 1.7 (Berkeley) %G% + * @(#)union.h 1.8 (Berkeley) %G% */ struct union_args { @@ -63,7 +63,10 @@ extern int union_mkshadow __P((struct union_mount *, struct vnode *, struct componentname *, struct vnode **)); extern int union_vn_create __P((struct vnode **, struct union_node *, struct proc *)); +extern int union_cn_close __P((struct vnode *, int, struct ucred *, + struct proc *)); extern void union_removed_upper __P((struct union_node *un)); +extern struct vnode *union_lowervp __P((struct vnode *)); #define MOUNTTOUNIONMOUNT(mp) ((struct union_mount *)((mp)->mnt_data)) #define VTOUNION(vp) ((struct union_node *)(vp)->v_data) diff --git a/usr/src/sys/miscfs/union/union_subr.c b/usr/src/sys/miscfs/union/union_subr.c index d34f594644..3da44e321c 100644 --- a/usr/src/sys/miscfs/union/union_subr.c +++ b/usr/src/sys/miscfs/union/union_subr.c @@ -8,7 +8,7 @@ * * %sccs.include.redist.c% * - * @(#)union_subr.c 1.7 (Berkeley) %G% + * @(#)union_subr.c 1.8 (Berkeley) %G% */ #include @@ -172,7 +172,7 @@ loop: un->un_next = 0; un->un_uppervp = uppervp; un->un_lowervp = lowervp; - un->un_open = 0; + un->un_openl = 0; un->un_flags = 0; if (cnp && (lowervp != NULLVP) && (lowervp->v_type == VREG)) { un->un_hash = cnp->cn_hash; @@ -472,9 +472,11 @@ bad: } int -union_vn_close(vp, fmode) +union_vn_close(vp, fmode, cred, p) struct vnode *vp; int fmode; + struct ucred *cred; + struct proc *p; { if (fmode & FWRITE) --vp->v_writecount; @@ -488,3 +490,17 @@ union_removed_upper(un) vrele(un->un_uppervp); un->un_uppervp = NULLVP; } + +struct vnode * +union_lowervp(vp) + struct vnode *vp; +{ + struct union_node *un = VTOUNION(vp); + + if (un->un_lowervp && (vp->v_type == un->un_lowervp->v_type)) { + if (vget(un->un_lowervp, 0)) + return (NULLVP); + } + + return (un->un_lowervp); +} diff --git a/usr/src/sys/miscfs/union/union_vfsops.c b/usr/src/sys/miscfs/union/union_vfsops.c index 49466ee24f..091f3aca7a 100644 --- a/usr/src/sys/miscfs/union/union_vfsops.c +++ b/usr/src/sys/miscfs/union/union_vfsops.c @@ -8,7 +8,7 @@ * * %sccs.include.redist.c% * - * @(#)union_vfsops.c 1.7 (Berkeley) %G% + * @(#)union_vfsops.c 1.8 (Berkeley) %G% */ /* diff --git a/usr/src/sys/miscfs/union/union_vnops.c b/usr/src/sys/miscfs/union/union_vnops.c index 65976d3061..088577520f 100644 --- a/usr/src/sys/miscfs/union/union_vnops.c +++ b/usr/src/sys/miscfs/union/union_vnops.c @@ -8,7 +8,7 @@ * * %sccs.include.redist.c% * - * @(#)union_vnops.c 1.7 (Berkeley) %G% + * @(#)union_vnops.c 1.8 (Berkeley) %G% */ #include @@ -402,7 +402,7 @@ union_open(ap) VOP_UNLOCK(tvp); } VOP_UNLOCK(un->un_uppervp); - union_vn_close(un->un_uppervp, FWRITE); + union_vn_close(un->un_uppervp, FWRITE, cred, p); VOP_LOCK(un->un_uppervp); if (!error) uprintf("union: copied up %s\n", @@ -966,7 +966,7 @@ union_readdir(ap) struct union_node *un = VTOUNION(ap->a_vp); if (un->un_uppervp) { - struct vnode *vp = OTHERVP(ap->a_vp); + struct vnode *vp = un->un_uppervp; VOP_LOCK(vp); error = VOP_READLINK(vp, ap->a_uio, ap->a_cred); @@ -1102,6 +1102,8 @@ union_lock(ap) else un->un_pid = -1; #endif + + return (0); } int @@ -1127,6 +1129,8 @@ union_unlock(ap) #ifdef DIAGNOSTIC un->un_pid = 0; #endif + + return (0); } int -- 2.20.1