summaryrefslogtreecommitdiffstats
path: root/sys/miscfs/procfs/procfs_vfsops.c
diff options
context:
space:
mode:
authorart <art@openbsd.org>2003-01-31 17:37:49 +0000
committerart <art@openbsd.org>2003-01-31 17:37:49 +0000
commit09308f32b21894f1b7f2c85a7835abe9e7be8953 (patch)
tree021a7870c0c64c55c6fc689cc6db1ecf2b7ea7d1 /sys/miscfs/procfs/procfs_vfsops.c
parentKNF (diff)
downloadwireguard-openbsd-09308f32b21894f1b7f2c85a7835abe9e7be8953.tar.xz
wireguard-openbsd-09308f32b21894f1b7f2c85a7835abe9e7be8953.zip
File system locking fixups, mostly from NetBSD:
- cache_lookup move common code from various fs's here always return with vnode and parent locked adjust return codes - PDIRUNLOCK - new flag set if lookup couldn't lock parent vnode - kernfs and procfs lock vnode in get_root don't unlock (again) in kernfs_freevp fix memory leak in procfs From tedu@stanford.edu deraadt@ and various other ok
Diffstat (limited to 'sys/miscfs/procfs/procfs_vfsops.c')
-rw-r--r--sys/miscfs/procfs/procfs_vfsops.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/sys/miscfs/procfs/procfs_vfsops.c b/sys/miscfs/procfs/procfs_vfsops.c
index 899369f0ffa..166de670487 100644
--- a/sys/miscfs/procfs/procfs_vfsops.c
+++ b/sys/miscfs/procfs/procfs_vfsops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: procfs_vfsops.c,v 1.16 2002/03/14 01:27:08 millert Exp $ */
+/* $OpenBSD: procfs_vfsops.c,v 1.17 2003/01/31 17:37:50 art Exp $ */
/* $NetBSD: procfs_vfsops.c,v 1.25 1996/02/09 22:40:53 christos Exp $ */
/*
@@ -82,6 +82,7 @@ procfs_mount(mp, path, data, ndp, p)
size_t size;
struct procfsmount *pmnt;
struct procfs_args args;
+ struct vnode *rvp;
int error;
if (UIO_MX & (UIO_MX-1)) {
@@ -102,10 +103,18 @@ procfs_mount(mp, path, data, ndp, p)
} else
args.flags = 0;
+ error = procfs_allocvp(mp, &rvp, 0, Proot);
+ if (error)
+ return (error);
+ rvp->v_type = VDIR;
+ rvp->v_flag |= VROOT;
+
mp->mnt_flag |= MNT_LOCAL;
pmnt = (struct procfsmount *) malloc(sizeof(struct procfsmount),
M_UFSMNT, M_WAITOK); /* XXX need new malloc type */
+ pmnt->rvp = rvp;
+
mp->mnt_data = (qaddr_t)pmnt;
vfs_getnewfsid(mp);
@@ -134,6 +143,7 @@ procfs_unmount(mp, mntflags, p)
int error;
extern int doforce;
int flags = 0;
+ struct vnode *rvp = VFSTOPROC(mp)->rvp;
if (mntflags & MNT_FORCE) {
/* procfs can never be rootfs so don't check for it */
@@ -142,8 +152,15 @@ procfs_unmount(mp, mntflags, p)
flags |= FORCECLOSE;
}
- if ((error = vflush(mp, 0, flags)) != 0)
+ vrele(rvp);
+
+ if ((error = vflush(mp, 0, flags)) != 0) {
+ vget(rvp, 0, curproc);
return (error);
+ }
+
+ free(VFSTOPROC(mp), M_UFSMNT);
+ mp->mnt_data = 0;
return (0);
}
@@ -153,8 +170,13 @@ procfs_root(mp, vpp)
struct mount *mp;
struct vnode **vpp;
{
+ struct vnode *vp = VFSTOPROC(mp)->rvp;
- return (procfs_allocvp(mp, vpp, 0, Proot));
+ VREF(vp);
+ vn_lock(vp, LK_EXCLUSIVE, curproc);
+ *vpp = vp;
+
+ return (0);
}
/* ARGSUSED */