*
* %sccs.include.redist.c%
*
- * @(#)vfs_syscalls.c 8.37 (Berkeley) %G%
+ * @(#)vfs_syscalls.c 8.38 (Berkeley) %G%
*/
#include <sys/param.h>
vput(vp);
vp = tdp;
}
- VOP_UNLOCK(vp, 0, p);
if (error) {
- vrele(vp);
+ vput(vp);
return (error);
}
+ VOP_UNLOCK(vp, 0, p);
vrele(fdp->fd_cdir);
fdp->fd_cdir = vp;
return (0);
error = ENOTDIR;
else
error = VOP_ACCESS(vp, VEXEC, p->p_ucred, p);
- VOP_UNLOCK(vp, 0, p);
if (error)
- vrele(vp);
+ vput(vp);
+ else
+ VOP_UNLOCK(vp, 0, p);
return (error);
}
#ifdef UNION
{
extern int (**union_vnodeop_p)();
- extern struct vnode *union_dircache __P((struct vnode *));
+ extern struct vnode *union_dircache __P((struct vnode*, struct proc*));
if ((SCARG(uap, count) == auio.uio_resid) &&
(vp->v_op == union_vnodeop_p)) {
struct vnode *lvp;
- lvp = union_dircache(vp);
+ lvp = union_dircache(vp, p);
if (lvp != NULLVP) {
struct vattr va;
if (lvp != NULLVP) {
error = VOP_OPEN(lvp, FREAD, fp->f_cred, p);
- VOP_UNLOCK(lvp, 0, p);
-
if (error) {
- vrele(lvp);
+ vput(lvp);
return (error);
}
+ VOP_UNLOCK(lvp, 0, p);
fp->f_data = (caddr_t) lvp;
fp->f_offset = 0;
error = vn_close(vp, FREAD, fp->f_cred, p);
#ifdef UNION
{
extern int (**union_vnodeop_p)();
- extern struct vnode *union_dircache __P((struct vnode *));
+ extern struct vnode *union_dircache __P((struct vnode*, struct proc*));
if ((SCARG(uap, count) == auio.uio_resid) &&
(vp->v_op == union_vnodeop_p)) {
struct vnode *lvp;
- lvp = union_dircache(vp);
+ lvp = union_dircache(vp, p);
if (lvp != NULLVP) {
struct vattr va;
lvp = NULL;
}
}
-
+
if (lvp != NULLVP) {
error = VOP_OPEN(lvp, FREAD, fp->f_cred, p);
- VOP_UNLOCK(lvp, 0, p);
-
if (error) {
- vrele(lvp);
+ vput(lvp);
return (error);
}
+ VOP_UNLOCK(lvp, 0, p);
fp->f_data = (caddr_t) lvp;
fp->f_offset = 0;
error = vn_close(vp, FREAD, fp->f_cred, p);