struct filedesc *fdp;
struct vnode *newdp;
struct proc *p;
+ struct vnode *tvp;
if (olddp->v_usecount == 1)
return;
for (p = allproc.lh_first; p != 0; p = p->p_list.le_next) {
fdp = p->p_fd;
if (fdp->fd_cdir == olddp) {
- vrele(fdp->fd_cdir);
VREF(newdp);
+ tvp = fdp->fd_cdir;
fdp->fd_cdir = newdp;
+ vrele(tvp);
}
if (fdp->fd_rdir == olddp) {
- vrele(fdp->fd_rdir);
VREF(newdp);
+ tvp = fdp->fd_rdir;
fdp->fd_rdir = newdp;
+ vrele(tvp);
}
}
if (rootvnode == olddp) {
- vrele(rootvnode);
VREF(newdp);
+ tvp = rootvnode;
rootvnode = newdp;
+ vrele(tvp);
}
vput(newdp);
}
register_t *retval;
{
register struct filedesc *fdp = p->p_fd;
- struct vnode *vp, *tdp;
+ struct vnode *vp, *tdp, *tvp;
struct mount *mp;
struct file *fp;
int error;
return (error);
}
VOP_UNLOCK(vp, 0, p);
- vrele(fdp->fd_cdir);
+ tvp = fdp->fd_cdir;
fdp->fd_cdir = vp;
+ vrele(tvp);
return (0);
}
register struct filedesc *fdp = p->p_fd;
int error;
struct nameidata nd;
+ struct vnode *tvp;
NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE,
uap->path, p);
if (error = change_dir(&nd, p))
return (error);
- vrele(fdp->fd_cdir);
+ tvp = fdp->fd_cdir;
fdp->fd_cdir = nd.ni_vp;
+ vrele(tvp);
return (0);
}
register struct filedesc *fdp = p->p_fd;
int error;
struct nameidata nd;
+ struct vnode *tvp;
if (error = suser(p->p_ucred, &p->p_acflag))
return (error);
return (error);
}
- if (fdp->fd_rdir != NULL)
- vrele(fdp->fd_rdir);
+ tvp = fdp->fd_rdir;
fdp->fd_rdir = nd.ni_vp;
+ if (tvp != NULL)
+ vrele(tvp);
return (0);
}