Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 May 2001 21:03:44 +0100
From:      Brian Somers <brian@Awfulhak.org>
To:        Peter Wemm <peter@wemm.org>
Cc:        Brian Somers <brian@Awfulhak.org>, Poul-Henning Kamp <phk@critter.freebsd.dk>, cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org, brian@Awfulhak.org
Subject:   Re: cvs commit: src/sys/fs/devfs devfs_vnops.c 
Message-ID:  <200105172003.f4HK3ib68172@hak.lan.Awfulhak.org>
In-Reply-To: Message from Peter Wemm <peter@wemm.org>  of "Thu, 17 May 2001 12:19:22 PDT." <20010517191922.B6C4D380A@overcee.netplex.com.au> 

next in thread | previous in thread | raw e-mail | index | archive | help
> Brian Somers wrote:
> > > >>   Revision  Changes    Path
> > > >>   1.23      +7 -15     src/sys/fs/devfs/devfs_vnops.c
> > > >
> > > >Does this mean that I can catch ``open("/dev/tun")'' and clone (say) 
> > > >/dev/tun100, returning that ?
> > > 
> > > yes :-)
> > 
> > I think the only thing that's missing is that you can't have the 
> > clone handler called for an existing device node.
> > 
> > I'd like to be able to make_dev() /dev/tun during attach and allow 
> > the sysadmin (or whatever) to change it's permissions.  Then, when an 
> > attempt to open it is made, have my clone handler called.  My clone 
> > handler make_dev()s /dev/tunN and returns that.  When /dev/tunN's 
> > final close is done, I destroy_dev() it.
> > 
> > Unfortunately, I don't think this can be done very easily.  We'd need 
> > to allocate a new vnode only at open time - probably in vn_open.  
> > It'd probably be convenient if devfs was able to set some new vnode 
> > flag in vnodes returned from it's lookup based on some flag passed 
> > into make_dev() (oops, there are no flags there).  When vn_open() 
> > sees the flag, it calls some registered handler that goes off and 
> > returns either the original vnode or (if successfully cloned) a new 
> > vnode.
> > 
> > Does any of that make sense ?
> 
> It does make sense, but are you sure it's needed?  The clone device (/dev/
> tun in this case) has the same attributes as the redirected device.  Ie: if
> you open /dev/tun, the attributes of it are actually those of /dev/tun100.
> I dont think we can have a persistant /dev/tun that actually shows up on
> ls(1) etc, because we'd then have races with multiple processes scanning/
> accessing the directories or accessing and opening by different processes
> at once.  Remember, the cloned device is different to every process.
> The whole permissions thing is a sticky one there.

I think my problem is that even though it's very sexy to be able to 
clone devices on demand, there should be some way of determining in 
advance (or of the sysadmin controlling) who can open these devices.

It's not easy to figure out what that means with cloning as it was, 
but now that we can have a specific device name that can be used 
again and again to get unique instances of the device, it seems clear 
that that specific device name should appear up front and be 
changable.

I expect to be able to

	if (stat("/dev/tun", &st) == -1)
		/* Clone device not supported - revert to old behaviour */
	else {
		printf("Opening %s\n", devname(st.st_dev, S_IFCHR));
		fd = open("/dev/tun", O_RDWR);
		fstat(fd, &st);
		printf("Got %s\n", devname(st.st_dev, S_IFCHR));
	}

and have output saying

Opening /dev/tun
Got /dev/tun100

I'm not sure that I see any races - vn_open could pass a vnode 
pointer pointer into VOP_OPEN.  Just before the devsw d_open is 
called, some handler could be asked if it'd like to change the dev_t.  
That handler can then make_dev(), returning the new dev_t, and d_open 
is passed that.  On the way back, a vnode is created for the new dev_t 
and the vnode is passed back up into vn_open() which blindly continues
as normal.

ls -l sees /dev/tun which is make_dev()d in attach and destroy_dev()d 
in detach, and may see other tun* devices if they've been make_dev()d 
by this magic handler and haven't yet been destroy_dev()d by their 
final close.

The Solaris (sysv?) way where a dev_t pointer is passed into d_open 
and may be changed is probably better - that way the driver can never 
be unsure about whether it's cloned a device that's about to be 
opened or not.... it just needs to track which minors are open (in 
fact, the infrastructure also does that for you in that you're 
guaranteed not to be detach()d if there are outstanding opens).

> Cheers,
> -Peter
> --
> Peter Wemm - peter@FreeBSD.org; peter@yahoo-inc.com; peter@netplex.com.au
> "All of this is for nothing if we don't go to the stars" - JMS/B5

-- 
Brian <brian@Awfulhak.org>                        <brian@[uk.]FreeBSD.org>
      <http://www.Awfulhak.org>;                   <brian@[uk.]OpenBSD.org>
Don't _EVER_ lose your sense of humour !



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200105172003.f4HK3ib68172>