diff options
| author | Sean Eric Fagan <sef@FreeBSD.org> | 1997-12-07 04:01:03 +0000 |
|---|---|---|
| committer | Sean Eric Fagan <sef@FreeBSD.org> | 1997-12-07 04:01:03 +0000 |
| commit | d99616387e9bea42e433edea6927b1ebd54ac346 (patch) | |
| tree | 901a422e37751595ba52a9bcb3570b5e953808fb /sys/miscfs | |
| parent | 5ced4af373aec4c891b71aca55f9ef9c9ae8d5ef (diff) | |
Notes
Diffstat (limited to 'sys/miscfs')
| -rw-r--r-- | sys/miscfs/procfs/procfs_vnops.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/sys/miscfs/procfs/procfs_vnops.c b/sys/miscfs/procfs/procfs_vnops.c index a1789da33ed9..8d83d8765c51 100644 --- a/sys/miscfs/procfs/procfs_vnops.c +++ b/sys/miscfs/procfs/procfs_vnops.c @@ -36,7 +36,7 @@ * * @(#)procfs_vnops.c 8.18 (Berkeley) 5/21/95 * - * $Id: procfs_vnops.c,v 1.43 1997/12/05 19:55:47 bde Exp $ + * $Id: procfs_vnops.c,v 1.44 1997/12/06 04:11:13 sef Exp $ */ /* @@ -173,11 +173,39 @@ procfs_close(ap) } */ *ap; { struct pfsnode *pfs = VTOPFS(ap->a_vp); + struct proc *p; switch (pfs->pfs_type) { case Pmem: if ((ap->a_fflag & FWRITE) && (pfs->pfs_flags & O_EXCL)) pfs->pfs_flags &= ~(FWRITE|O_EXCL); + /* + * This rather complicated-looking code is trying to + * determine if this was the last close on this particular + * vnode. While one would expect v_usecount to be 1 at + * that point, it seems that (according to John Dyson) + * the VM system will bump up the usecount. So: if the + * usecount is 2, and VVMIO is set, then this is really + * the last close. Otherwise, if the usecount is < 2 + * then it is definitely the last close. + * If this is the last close, then it checks to see if + * the target process has PF_LINGER set in p_pfsflags, + * if this is *not* the case, then the process' stop flags + * are cleared, and the process is woken up. This is + * to help prevent the case where a process has been + * told to stop on an event, but then the requesting process + * has gone away or forgotten about it. + */ + if (((ap->a_vp->v_usecount == 2 + && ap->a_vp->v_object + && (ap->a_vp->v_flag & VVMIO)) || + (ap->a_vp->v_usecount < 2)) + && (p = pfind(pfs->pfs_pid)) + && !(p->p_pfsflags & PF_LINGER)) { + p->p_stops = 0; + p->p_step = 0; + wakeup(&p->p_step); + } break; default: break; |
