summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_descrip.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2004-12-14 08:23:18 +0000
committerphk <phk@FreeBSD.org>2004-12-14 08:23:18 +0000
commitb124f6c510c48e1ce8a71ea17a354f49c71fc9a0 (patch)
treedf03aa1d286d7dba376e11334524c4db6b1c4c69 /sys/kern/kern_descrip.c
parent1aeacc6d758a98e0123a715483220a3edf37897f (diff)
downloadFreeBSD-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.c48
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)
{
OpenPOWER on IntegriCloud