From owner-freebsd-current@FreeBSD.ORG Mon Jan 24 09:58:21 2005 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id A34C516A4CE for ; Mon, 24 Jan 2005 09:58:21 +0000 (GMT) Received: from fledge.watson.org (fledge.watson.org [204.156.12.50]) by mx1.FreeBSD.org (Postfix) with ESMTP id 225C543D1D for ; Mon, 24 Jan 2005 09:58:21 +0000 (GMT) (envelope-from robert@fledge.watson.org) Received: from fledge.watson.org (localhost [127.0.0.1]) by fledge.watson.org (8.13.1/8.13.1) with ESMTP id j0O9vfrK063610; Mon, 24 Jan 2005 04:57:41 -0500 (EST) (envelope-from robert@fledge.watson.org) Received: from localhost (robert@localhost)j0O9vflv063607; Mon, 24 Jan 2005 09:57:41 GMT (envelope-from robert@fledge.watson.org) Date: Mon, 24 Jan 2005 09:57:41 +0000 (GMT) From: Robert Watson X-Sender: robert@fledge.watson.org To: Pete Carah In-Reply-To: <20050124055703.GA40104@users.altadena.net> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII cc: current@freebsd.org Subject: Re: Devd event from GEOM? X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 24 Jan 2005 09:58:21 -0000 On Sun, 23 Jan 2005, Pete Carah wrote: > Geom doesn't feed node-creations to devd in 5.3. This would be VERY > useful for letting ordinary non-programmer users access pen drives, > among other things (floppies come to mind too...). (or mount e.g. a pen > drive as part of an authentication system where no-one is yet logged in, > so can't manually mount...) > > umass0 comes in to devd, but this isn't useful for use in "mount". One > needs the disk device nodes. I suppose one *could* parse dmesg for the > info (or maybe sysctl) but that smacks of a serious kluge. (not to > mention that the slice table isn't represented in dmesg anyhow, and > practically nothing is in sysctl...) > > Does this yet happen in any later version (RELENG_5 or HEAD)? If not, > is there anyone planning or working on it? > > It *does* work in Solaris and IRIX, (I know - we aren't them...) I > don't know about any Linux or other *BSD version either. > > Geom is modular enough that this shouldn't be difficult... I used the attached patches do announce storage device arrival on my notebook so that I can do auto-mounting of USB storage. There appears to be some disagreement regarding layering: my opinion has generally been that since there are multiple layers involved, we should announce both the layer and the device, for example: Network stack says "ifnet fxp0 arrived" separately from: /dev says "/dev/net/fxp0 arrived" Since they constitute different "things" with quite different management properties. This also provides additional contextual information: rather than devd having to guess what type of object a device node is using name matching, by learning about it through geom or the network stack, it knows what kind it is up front in a strong way. Robert N M Watson Index: geom.h =================================================================== RCS file: /home/ncvs/src/sys/geom/geom.h,v retrieving revision 1.90 diff -u -r1.90 geom.h --- geom.h 21 Dec 2004 18:32:46 -0000 1.90 +++ geom.h 22 Dec 2004 18:43:59 -0000 @@ -200,6 +200,10 @@ void g_dev_print(void); struct g_provider *g_dev_getprovider(struct cdev *dev); +/* geom_devctl.c */ +void g_dev_added(const char *); +void g_dev_removed(const char *); + /* geom_dump.c */ void g_trace(int level, const char *, ...); # define G_T_TOPOLOGY 1 Index: geom_dev.c =================================================================== RCS file: /home/ncvs/src/sys/geom/geom_dev.c,v retrieving revision 1.87 diff -u -r1.87 geom_dev.c --- geom_dev.c 12 Dec 2004 10:09:05 -0000 1.87 +++ geom_dev.c 22 Dec 2004 18:43:59 -0000 @@ -151,6 +151,7 @@ UID_ROOT, GID_OPERATOR, 0640, gp->name); if (pp->flags & G_PF_CANDELETE) dev->si_flags |= SI_CANDELETE; + g_dev_added(gp->name); mtx_unlock(&Giant); g_topology_lock(); dev->si_iosize_max = MAXPHYS; @@ -415,6 +416,9 @@ destroy_dev(dev); free_unr(unithdr, unit); + /* Send a note to userspace for any cleanup it wants to do. */ + g_dev_removed(gp->name); + /* Wait for the cows to come home */ while (cp->nstart != cp->nend) msleep(&dev, NULL, PRIBIO, "gdevorphan", hz / 10); Index: geom_devctl.c =================================================================== RCS file: geom_devctl.c diff -N geom_devctl.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ geom_devctl.c 18 Feb 2004 00:26:23 -0000 @@ -0,0 +1,66 @@ +/*- + * Copyright (c) 2004 Robert N. M. Watson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +/* + * GEOM disk event stream for userspace: notification of arrival and + * deletion of GEOM-visible /dev entries. + */ + +#include +#include +#include +#include +#include + +#include + +void +g_dev_added(const char *disk) +{ + struct sbuf sb; + + sbuf_new(&sb, NULL, 0, SBUF_AUTOEXTEND); + sbuf_printf(&sb, "+%s at on geom", disk); + sbuf_finish(&sb); + devctl_queue_data(sbuf_data(&sb)); + printf("geom: sent devctl '%s'\n", sbuf_data(&sb)); + sbuf_done(&sb); +} + +void +g_dev_removed(const char *disk) +{ + struct sbuf sb; + + sbuf_new(&sb, NULL, 0, SBUF_AUTOEXTEND); + sbuf_printf(&sb, "-%s at on geom", disk); + sbuf_finish(&sb); + devctl_queue_data(sbuf_data(&sb)); + printf("geom: sent devctl '%s'\n", sbuf_data(&sb)); + sbuf_done(&sb); +}