From 5f3f68a8bacb9c68ddc0b4919cf1df7827b77b01 Mon Sep 17 00:00:00 2001 From: KATO Takenori Date: Fri, 2 May 1997 03:21:54 +0000 Subject: [PATCH] Access correct union mount point in union_access. Old vnode is saved in savedvp variable and it is used for the argument of MOUNTTOUNIONMOUNT(). I didn't realize ap->a_vp is modified before MOUNTTOUNIONMOUNT(), so the change by revision 1.22 is incorrect. --- sys/fs/unionfs/union_vnops.c | 6 ++++-- sys/miscfs/union/union_vnops.c | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/sys/fs/unionfs/union_vnops.c b/sys/fs/unionfs/union_vnops.c index 00e486221a7..a8b51e46e79 100644 --- a/sys/fs/unionfs/union_vnops.c +++ b/sys/fs/unionfs/union_vnops.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * @(#)union_vnops.c 8.32 (Berkeley) 6/23/95 - * $Id: union_vnops.c,v 1.30 1997/04/27 10:49:37 kato Exp $ + * $Id: union_vnops.c,v 1.31 1997/04/29 02:06:07 kato Exp $ */ #include @@ -644,6 +644,7 @@ union_access(ap) struct proc *p = ap->a_p; int error = EACCES; struct vnode *vp; + struct vnode *savedvp; if ((vp = un->un_uppervp) != NULLVP) { FIXUP(un, p); @@ -653,10 +654,11 @@ union_access(ap) if ((vp = un->un_lowervp) != NULLVP) { vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p); + savedvp = ap->a_vp; ap->a_vp = vp; error = VCALL(vp, VOFFSET(vop_access), ap); if (error == 0) { - struct union_mount *um = MOUNTTOUNIONMOUNT(ap->a_vp->v_mount); + struct union_mount *um = MOUNTTOUNIONMOUNT(savedvp->v_mount); if (um->um_op == UNMNT_BELOW) { ap->a_cred = um->um_cred; diff --git a/sys/miscfs/union/union_vnops.c b/sys/miscfs/union/union_vnops.c index 00e486221a7..a8b51e46e79 100644 --- a/sys/miscfs/union/union_vnops.c +++ b/sys/miscfs/union/union_vnops.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * @(#)union_vnops.c 8.32 (Berkeley) 6/23/95 - * $Id: union_vnops.c,v 1.30 1997/04/27 10:49:37 kato Exp $ + * $Id: union_vnops.c,v 1.31 1997/04/29 02:06:07 kato Exp $ */ #include @@ -644,6 +644,7 @@ union_access(ap) struct proc *p = ap->a_p; int error = EACCES; struct vnode *vp; + struct vnode *savedvp; if ((vp = un->un_uppervp) != NULLVP) { FIXUP(un, p); @@ -653,10 +654,11 @@ union_access(ap) if ((vp = un->un_lowervp) != NULLVP) { vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p); + savedvp = ap->a_vp; ap->a_vp = vp; error = VCALL(vp, VOFFSET(vop_access), ap); if (error == 0) { - struct union_mount *um = MOUNTTOUNIONMOUNT(ap->a_vp->v_mount); + struct union_mount *um = MOUNTTOUNIONMOUNT(savedvp->v_mount); if (um->um_op == UNMNT_BELOW) { ap->a_cred = um->um_cred;