diff options
| author | 2008-04-08 14:46:45 +0000 | |
|---|---|---|
| committer | 2008-04-08 14:46:45 +0000 | |
| commit | 43ba3c33f7056a6498869018ae580cca628c2ac2 (patch) | |
| tree | a4d79c440b0ada362c82da1f9d5200d593270d90 /sys/miscfs/specfs/spec_subr.c | |
| parent | Split the cdev makro for bpftun into two seperate definitions. tun(4) and (diff) | |
| download | wireguard-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.c | 22 |
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 */ } |
