summaryrefslogtreecommitdiffstats
path: root/sys/fs
diff options
context:
space:
mode:
authoralex <alex@FreeBSD.org>1998-07-27 01:07:01 +0000
committeralex <alex@FreeBSD.org>1998-07-27 01:07:01 +0000
commitbe85829abc29955fefb5e3d02795b8ace7970f22 (patch)
tree27ca7255e7e8921d8895542450ed7250c18d7f3b /sys/fs
parent573de313c073e4d75922a344ed07b839b6d268a4 (diff)
downloadFreeBSD-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/fs')
-rw-r--r--sys/fs/procfs/procfs_vfsops.c33
1 files changed, 10 insertions, 23 deletions
diff --git a/sys/fs/procfs/procfs_vfsops.c b/sys/fs/procfs/procfs_vfsops.c
index fdd7a89..b84ae7f 100644
--- a/sys/fs/procfs/procfs_vfsops.c
+++ b/sys/fs/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
-
OpenPOWER on IntegriCloud