diff options
author | alex <alex@FreeBSD.org> | 1998-07-27 01:07:01 +0000 |
---|---|---|
committer | alex <alex@FreeBSD.org> | 1998-07-27 01:07:01 +0000 |
commit | be85829abc29955fefb5e3d02795b8ace7970f22 (patch) | |
tree | 27ca7255e7e8921d8895542450ed7250c18d7f3b /sys/miscfs | |
parent | 573de313c073e4d75922a344ed07b839b6d268a4 (diff) | |
download | FreeBSD-src-be85829abc29955fefb5e3d02795b8ace7970f22.zip FreeBSD-src-be85829abc29955fefb5e3d02795b8ace7970f22.tar.gz |
A better solution to the rm_at_exit problem: Register the exit function
during first mount. Unregister the exit function at last unmount.
Concept by: sef
Reviewed by: sef
Implemented by: alex
Diffstat (limited to 'sys/miscfs')
-rw-r--r-- | sys/miscfs/procfs/procfs_vfsops.c | 33 |
1 files changed, 10 insertions, 23 deletions
diff --git a/sys/miscfs/procfs/procfs_vfsops.c b/sys/miscfs/procfs/procfs_vfsops.c index fdd7a89..b84ae7f 100644 --- a/sys/miscfs/procfs/procfs_vfsops.c +++ b/sys/miscfs/procfs/procfs_vfsops.c @@ -36,7 +36,7 @@ * * @(#)procfs_vfsops.c 8.7 (Berkeley) 5/10/95 * - * $Id: procfs_vfsops.c,v 1.22 1998/06/07 17:11:58 dfr Exp $ + * $Id: procfs_vfsops.c,v 1.23 1998/07/25 15:52:44 alex Exp $ */ /* @@ -76,6 +76,7 @@ procfs_mount(mp, path, data, ndp, p) struct proc *p; { size_t size; + int error; if (UIO_MX & (UIO_MX-1)) { log(LOG_ERR, "procfs: invalid directory entry size\n"); @@ -85,6 +86,11 @@ procfs_mount(mp, path, data, ndp, p) if (mp->mnt_flag & MNT_UPDATE) return (EOPNOTSUPP); + if (mp->mnt_vfc->vfc_refcount == 1 && (error = at_exit(procfs_exit))) { + printf("procfs: cannot register procfs_exit with at_exit -- error %d\n", error); + return(error); + } + mp->mnt_flag |= MNT_LOCAL; mp->mnt_data = 0; vfs_getnewfsid(mp); @@ -112,6 +118,9 @@ procfs_unmount(mp, mntflags, p) int error; int flags = 0; + if (mp->mnt_vfc->vfc_refcount == 1) + rm_at_exit(procfs_exit); + if (mntflags & MNT_FORCE) flags |= FORCECLOSE; @@ -173,11 +182,6 @@ static int procfs_init(vfsp) struct vfsconf *vfsp; { - int error; - - if (error = at_exit(procfs_exit)) - printf("procfs: cannot register procfs_exit with at_exit -- error %d\n", error); - return (0); } @@ -208,20 +212,3 @@ static struct vfsops procfs_vfsops = { }; VFS_SET(procfs_vfsops, procfs, MOUNT_PROCFS, VFCF_SYNTHETIC); - -#ifdef VFS_LKM -static int -procfs_unload () -{ - rm_at_exit(procfs_exit); - return(0); -} - -int -procfs_mod(struct lkm_table *lkmtp, int cmd, int ver) -{ - MOD_DISPATCH(procfs, lkmtp, cmd, ver, lkm_nullcmd, - procfs_unload, lkm_nullcmd); -} -#endif - |