diff options
-rw-r--r-- | sys/fs/unionfs/union_vfsops.c | 4 | ||||
-rw-r--r-- | sys/fs/unionfs/union_vnops.c | 12 | ||||
-rw-r--r-- | sys/kern/vfs_extattr.c | 3 | ||||
-rw-r--r-- | sys/kern/vfs_syscalls.c | 3 | ||||
-rw-r--r-- | sys/miscfs/union/union_vfsops.c | 4 | ||||
-rw-r--r-- | sys/miscfs/union/union_vnops.c | 12 |
6 files changed, 26 insertions, 12 deletions
diff --git a/sys/fs/unionfs/union_vfsops.c b/sys/fs/unionfs/union_vfsops.c index 580941e..393fe9d 100644 --- a/sys/fs/unionfs/union_vfsops.c +++ b/sys/fs/unionfs/union_vfsops.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * @(#)union_vfsops.c 8.7 (Berkeley) 3/5/94 - * $Id: union_vfsops.c,v 1.5 1994/09/22 19:38:20 wollman Exp $ + * $Id: union_vfsops.c,v 1.6 1994/10/10 07:55:47 phk Exp $ */ /* @@ -257,6 +257,8 @@ union_mount(mp, path, data, ndp, p) (void) copyinstr(args.target, cp, len - 1, &size); bzero(cp + size, len - size); + (void)union_statfs(mp, &mp->mnt_stat, p); + #ifdef UNION_DIAGNOSTIC printf("union_mount: from %s, on %s\n", mp->mnt_stat.f_mntfromname, mp->mnt_stat.f_mntonname); diff --git a/sys/fs/unionfs/union_vnops.c b/sys/fs/unionfs/union_vnops.c index decf8f3..df1935b 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.6 (Berkeley) 2/17/94 - * $Id: union_vnops.c,v 1.6 1994/10/06 21:06:49 davidg Exp $ + * $Id: union_vnops.c,v 1.7 1994/10/10 07:55:48 phk Exp $ */ #include <sys/param.h> @@ -53,8 +53,13 @@ #include <sys/queue.h> #include <miscfs/union/union.h> +/* FIXUP throws the lock on the uppervp vnode if the union_node is already + * locked and the uppervp vnode is not. Before, this was thrown regardless + * of the state of the union_node which resulted in locked vnodes which + * were never unlocked (since the union would never be unlocked). + */ #define FIXUP(un) { \ - if (((un)->un_flags & UN_ULOCK) == 0) { \ + if (((un)->un_flags & (UN_LOCKED|UN_ULOCK)) == UN_LOCKED) { \ union_fixup(un); \ } \ } @@ -1136,7 +1141,6 @@ union_symlink(ap) int union_readdir(ap) struct vop_readdir_args /* { - struct vnodeop_desc *a_desc; struct vnode *a_vp; struct uio *a_uio; struct ucred *a_cred; @@ -1147,7 +1151,7 @@ union_readdir(ap) if (un->un_uppervp) { FIXUP(un); - error = VOP_READDIR(un->un_uppervp, ap->a_uio, ap->a_cred); + error = VOP_READDIR(un->un_uppervp, ap->a_uio, ap->a_cred, NULL, NULL, NULL); } return (error); diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c index c730946..e5c5218 100644 --- a/sys/kern/vfs_extattr.c +++ b/sys/kern/vfs_extattr.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)vfs_syscalls.c 8.13 (Berkeley) 4/15/94 - * $Id: vfs_syscalls.c,v 1.14 1994/10/15 02:53:26 phk Exp $ + * $Id: vfs_syscalls.c,v 1.15 1994/10/21 01:19:15 wollman Exp $ */ #include <sys/param.h> @@ -2153,6 +2153,7 @@ unionread: #endif if ((uap->count == auio.uio_resid) && + vp && (vp->v_flag & VROOT) && (vp->v_mount->mnt_flag & MNT_UNION)) { struct vnode *tvp = vp; diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index c730946..e5c5218 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)vfs_syscalls.c 8.13 (Berkeley) 4/15/94 - * $Id: vfs_syscalls.c,v 1.14 1994/10/15 02:53:26 phk Exp $ + * $Id: vfs_syscalls.c,v 1.15 1994/10/21 01:19:15 wollman Exp $ */ #include <sys/param.h> @@ -2153,6 +2153,7 @@ unionread: #endif if ((uap->count == auio.uio_resid) && + vp && (vp->v_flag & VROOT) && (vp->v_mount->mnt_flag & MNT_UNION)) { struct vnode *tvp = vp; diff --git a/sys/miscfs/union/union_vfsops.c b/sys/miscfs/union/union_vfsops.c index 580941e..393fe9d 100644 --- a/sys/miscfs/union/union_vfsops.c +++ b/sys/miscfs/union/union_vfsops.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * @(#)union_vfsops.c 8.7 (Berkeley) 3/5/94 - * $Id: union_vfsops.c,v 1.5 1994/09/22 19:38:20 wollman Exp $ + * $Id: union_vfsops.c,v 1.6 1994/10/10 07:55:47 phk Exp $ */ /* @@ -257,6 +257,8 @@ union_mount(mp, path, data, ndp, p) (void) copyinstr(args.target, cp, len - 1, &size); bzero(cp + size, len - size); + (void)union_statfs(mp, &mp->mnt_stat, p); + #ifdef UNION_DIAGNOSTIC printf("union_mount: from %s, on %s\n", mp->mnt_stat.f_mntfromname, mp->mnt_stat.f_mntonname); diff --git a/sys/miscfs/union/union_vnops.c b/sys/miscfs/union/union_vnops.c index decf8f3..df1935b 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.6 (Berkeley) 2/17/94 - * $Id: union_vnops.c,v 1.6 1994/10/06 21:06:49 davidg Exp $ + * $Id: union_vnops.c,v 1.7 1994/10/10 07:55:48 phk Exp $ */ #include <sys/param.h> @@ -53,8 +53,13 @@ #include <sys/queue.h> #include <miscfs/union/union.h> +/* FIXUP throws the lock on the uppervp vnode if the union_node is already + * locked and the uppervp vnode is not. Before, this was thrown regardless + * of the state of the union_node which resulted in locked vnodes which + * were never unlocked (since the union would never be unlocked). + */ #define FIXUP(un) { \ - if (((un)->un_flags & UN_ULOCK) == 0) { \ + if (((un)->un_flags & (UN_LOCKED|UN_ULOCK)) == UN_LOCKED) { \ union_fixup(un); \ } \ } @@ -1136,7 +1141,6 @@ union_symlink(ap) int union_readdir(ap) struct vop_readdir_args /* { - struct vnodeop_desc *a_desc; struct vnode *a_vp; struct uio *a_uio; struct ucred *a_cred; @@ -1147,7 +1151,7 @@ union_readdir(ap) if (un->un_uppervp) { FIXUP(un); - error = VOP_READDIR(un->un_uppervp, ap->a_uio, ap->a_cred); + error = VOP_READDIR(un->un_uppervp, ap->a_uio, ap->a_cred, NULL, NULL, NULL); } return (error); |