summaryrefslogtreecommitdiffstats
path: root/sys/miscfs/specfs/spec_subr.c
diff options
context:
space:
mode:
authorthib <thib@openbsd.org>2008-04-08 14:46:45 +0000
committerthib <thib@openbsd.org>2008-04-08 14:46:45 +0000
commit43ba3c33f7056a6498869018ae580cca628c2ac2 (patch)
treea4d79c440b0ada362c82da1f9d5200d593270d90 /sys/miscfs/specfs/spec_subr.c
parentSplit the cdev makro for bpftun into two seperate definitions. tun(4) and (diff)
downloadwireguard-openbsd-43ba3c33f7056a6498869018ae580cca628c2ac2.tar.xz
wireguard-openbsd-43ba3c33f7056a6498869018ae580cca628c2ac2.zip
bring cloning up too date; Munge it so it will work with atleast
oga@'s upcoming DRM changes and too some degree ratchov@'s audio work. It still works for bpf's though. Parts from ratchov@; fstat(1) parts from Pedro Martelletto; tested by many, ok'ed by a few; "get going with cloning" deraadt@
Diffstat (limited to 'sys/miscfs/specfs/spec_subr.c')
-rw-r--r--sys/miscfs/specfs/spec_subr.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/sys/miscfs/specfs/spec_subr.c b/sys/miscfs/specfs/spec_subr.c
index 399aa02c7b1..2077afe0b35 100644
--- a/sys/miscfs/specfs/spec_subr.c
+++ b/sys/miscfs/specfs/spec_subr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: spec_subr.c,v 1.3 2007/12/09 20:54:01 jmc Exp $ */
+/* $OpenBSD: spec_subr.c,v 1.4 2008/04/08 14:46:45 thib Exp $ */
/*
* Copyright (c) 2006 Pedro Martelletto <pedro@ambientworks.net>
@@ -25,6 +25,12 @@
#include <miscfs/specfs/specdev.h>
+#ifdef CLONE_DEBUG
+#define DNPRINTF(m...) do { printf(m); } while (0)
+#else
+#define DNPRINTF(m...) /* nothing */
+#endif
+
int
spec_open_clone(struct vop_open_args *ap)
{
@@ -32,6 +38,8 @@ spec_open_clone(struct vop_open_args *ap)
struct cloneinfo *cip;
int error, i;
+ DNPRINTF("cloning vnode\n");
+
for (i = 1; i < sizeof(vp->v_specbitmap) * NBBY; i++)
if (isclr(vp->v_specbitmap, i)) {
setbit(vp->v_specbitmap, i);
@@ -41,9 +49,6 @@ spec_open_clone(struct vop_open_args *ap)
if (i == sizeof(vp->v_specbitmap) * NBBY)
return (EBUSY); /* too many open instances */
- printf("spec_open_clone(): cloning device (%d, %d) for pid %u\n",
- major(vp->v_rdev), minor(vp->v_rdev), curproc->p_pid);
-
error = cdevvp(makedev(major(vp->v_rdev), i), &cvp);
if (error)
return (error); /* out of vnodes */
@@ -60,6 +65,8 @@ spec_open_clone(struct vop_open_args *ap)
return (error); /* device open failed */
}
+ cvp->v_flag |= VCLONE;
+
cip = malloc(sizeof(struct cloneinfo), M_TEMP, M_WAITOK);
cip->ci_data = vp->v_data;
cip->ci_vp = cvp;
@@ -68,8 +75,7 @@ spec_open_clone(struct vop_open_args *ap)
vp->v_flag |= VCLONED;
vp->v_data = cip;
- printf("spec_open_clone(): new minor for cloned device is %d\n",
- minor(cvp->v_rdev));
+ DNPRINTF("clone of vnode %p is vnode %p\n", vp, cvp);
return (0); /* device cloned */
}
@@ -87,9 +93,7 @@ spec_close_clone(struct vop_close_args *ap)
pvp = vp->v_specparent; /* get parent device */
clrbit(pvp->v_specbitmap, minor(vp->v_rdev));
-
- printf("spec_close_clone(): freeing minor %d of dev %d for"
- " pid %u\n", minor(vp->v_rdev), major(vp->v_rdev), curproc->p_pid);
+ vrele(pvp);
return (0); /* clone closed */
}