fix readdir for non-linear union stacks
authorJan-Simon Pendry <pendry@ucbvax.Berkeley.EDU>
Sun, 11 Dec 1994 05:04:32 +0000 (21:04 -0800)
committerJan-Simon Pendry <pendry@ucbvax.Berkeley.EDU>
Sun, 11 Dec 1994 05:04:32 +0000 (21:04 -0800)
SCCS-vsn: sys/kern/vfs_syscalls.c 8.28

usr/src/sys/kern/vfs_syscalls.c

index b1dcf00..4063304 100644 (file)
@@ -9,7 +9,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)vfs_syscalls.c      8.27 (Berkeley) %G%
+ *     @(#)vfs_syscalls.c      8.28 (Berkeley) %G%
  */
 
 #include <sys/param.h>
  */
 
 #include <sys/param.h>
@@ -232,7 +232,6 @@ checkdirs(olddp)
                        vrele(fdp->fd_cdir);
                        VREF(newdp);
                        fdp->fd_cdir = newdp;
                        vrele(fdp->fd_cdir);
                        VREF(newdp);
                        fdp->fd_cdir = newdp;
-                       printf("patch cdir for proc %d\n", p->p_pid);
                }
                if (fdp->fd_rdir == olddp) {
                        vrele(fdp->fd_rdir);
                }
                if (fdp->fd_rdir == olddp) {
                        vrele(fdp->fd_rdir);
@@ -2121,13 +2120,13 @@ unionread:
 #ifdef UNION
 {
        extern int (**union_vnodeop_p)();
 #ifdef UNION
 {
        extern int (**union_vnodeop_p)();
-       extern struct vnode *union_lowervp __P((struct vnode *));
+       extern struct vnode *union_dircache __P((struct vnode *));
 
        if ((uap->count == auio.uio_resid) &&
            (vp->v_op == union_vnodeop_p)) {
                struct vnode *lvp;
 
 
        if ((uap->count == auio.uio_resid) &&
            (vp->v_op == union_vnodeop_p)) {
                struct vnode *lvp;
 
-               lvp = union_lowervp(vp);
+               lvp = union_dircache(vp);
                if (lvp != NULLVP) {
                        struct vattr va;
 
                if (lvp != NULLVP) {
                        struct vattr va;
 
@@ -2137,13 +2136,12 @@ unionread:
                         */
                        error = VOP_GETATTR(vp, &va, fp->f_cred, p);
                        if (va.va_flags & OPAQUE) {
                         */
                        error = VOP_GETATTR(vp, &va, fp->f_cred, p);
                        if (va.va_flags & OPAQUE) {
-                               vrele(lvp);
+                               vput(lvp);
                                lvp = NULL;
                        }
                }
                
                if (lvp != NULLVP) {
                                lvp = NULL;
                        }
                }
                
                if (lvp != NULLVP) {
-                       VOP_LOCK(lvp);
                        error = VOP_OPEN(lvp, FREAD, fp->f_cred, p);
                        VOP_UNLOCK(lvp);
 
                        error = VOP_OPEN(lvp, FREAD, fp->f_cred, p);
                        VOP_UNLOCK(lvp);
 
@@ -2228,13 +2226,13 @@ unionread:
 #ifdef UNION
 {
        extern int (**union_vnodeop_p)();
 #ifdef UNION
 {
        extern int (**union_vnodeop_p)();
-       extern struct vnode *union_lowervp __P((struct vnode *));
+       extern struct vnode *union_dircache __P((struct vnode *));
 
        if ((uap->count == auio.uio_resid) &&
            (vp->v_op == union_vnodeop_p)) {
                struct vnode *lvp;
 
 
        if ((uap->count == auio.uio_resid) &&
            (vp->v_op == union_vnodeop_p)) {
                struct vnode *lvp;
 
-               lvp = union_lowervp(vp);
+               lvp = union_dircache(vp);
                if (lvp != NULLVP) {
                        struct vattr va;
 
                if (lvp != NULLVP) {
                        struct vattr va;
 
@@ -2244,13 +2242,12 @@ unionread:
                         */
                        error = VOP_GETATTR(vp, &va, fp->f_cred, p);
                        if (va.va_flags & OPAQUE) {
                         */
                        error = VOP_GETATTR(vp, &va, fp->f_cred, p);
                        if (va.va_flags & OPAQUE) {
-                               vrele(lvp);
+                               vput(lvp);
                                lvp = NULL;
                        }
                }
                
                if (lvp != NULLVP) {
                                lvp = NULL;
                        }
                }
                
                if (lvp != NULLVP) {
-                       VOP_LOCK(lvp);
                        error = VOP_OPEN(lvp, FREAD, fp->f_cred, p);
                        VOP_UNLOCK(lvp);
 
                        error = VOP_OPEN(lvp, FREAD, fp->f_cred, p);
                        VOP_UNLOCK(lvp);