diff options
author | phk <phk@FreeBSD.org> | 2004-12-14 08:23:18 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2004-12-14 08:23:18 +0000 |
commit | b124f6c510c48e1ce8a71ea17a354f49c71fc9a0 (patch) | |
tree | df03aa1d286d7dba376e11334524c4db6b1c4c69 /sys/kern/kern_descrip.c | |
parent | 1aeacc6d758a98e0123a715483220a3edf37897f (diff) | |
download | FreeBSD-src-b124f6c510c48e1ce8a71ea17a354f49c71fc9a0.zip FreeBSD-src-b124f6c510c48e1ce8a71ea17a354f49c71fc9a0.tar.gz |
Move the checkdirs() function from vfs_mount.c to kern_descrip.c and
call it mountcheckdirs().
Diffstat (limited to 'sys/kern/kern_descrip.c')
-rw-r--r-- | sys/kern/kern_descrip.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 754a3cb..28afe11 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -2256,6 +2256,54 @@ dupfdopen(struct thread *td, struct filedesc *fdp, int indx, int dfd, int mode, /* NOTREACHED */ } +/* + * Scan all active processes to see if any of them have a current + * or root directory of `olddp'. If so, replace them with the new + * mount point. + */ +void +mountcheckdirs(olddp, newdp) + struct vnode *olddp, *newdp; +{ + struct filedesc *fdp; + struct proc *p; + int nrele; + + if (vrefcnt(olddp) == 1) + return; + sx_slock(&allproc_lock); + LIST_FOREACH(p, &allproc, p_list) { + mtx_lock(&fdesc_mtx); + fdp = p->p_fd; + if (fdp == NULL) { + mtx_unlock(&fdesc_mtx); + continue; + } + nrele = 0; + FILEDESC_LOCK_FAST(fdp); + if (fdp->fd_cdir == olddp) { + vref(newdp); + fdp->fd_cdir = newdp; + nrele++; + } + if (fdp->fd_rdir == olddp) { + vref(newdp); + fdp->fd_rdir = newdp; + nrele++; + } + FILEDESC_UNLOCK_FAST(fdp); + mtx_unlock(&fdesc_mtx); + while (nrele--) + vrele(olddp); + } + sx_sunlock(&allproc_lock); + if (rootvnode == olddp) { + vrele(rootvnode); + vref(newdp); + rootvnode = newdp; + } +} + struct filedesc_to_leader * filedesc_to_leader_alloc(struct filedesc_to_leader *old, struct filedesc *fdp, struct proc *leader) { |