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:
parent
610fae39e9
commit
c4a7b7e10c
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user