From tim@cs.city.ac.uk (Tim Wilkinson):

Find enclosed a short bugfix to get the union filesystem up and running
in FreeBSD-current.  We don't think we've got all the problems yet but
these fixes sort out the major ones (which mostly concert bad locking
of vnodes), no doubt we'll post others as necessary.  Known problems
include the inability of the umount command (not the system call) to unmount
unions in certain circumstances (this is due the way "realpath" works),
and the failure of direntries to always get all available files in
unioned subdirectories.  We are, as they say, working on it.

Submitted by:	tim@cs.city.ac.uk (Tim Wilkinson)
This commit is contained in:
David Greenman 1994-11-04 14:41:46 +00:00
parent 610fae39e9
commit c4a7b7e10c
6 changed files with 26 additions and 12 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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);