Add devd(8) notifications for creation and destruction of GEOM devices.

Differential Revision:	https://reviews.freebsd.org/D1211
MFC after:	1 month
Sponsored by:	The FreeBSD Foundation
This commit is contained in:
Edward Tomasz Napierala 2015-01-14 11:15:57 +00:00
parent d4f46a775d
commit 01de1a0650
2 changed files with 37 additions and 2 deletions

View File

@ -41,7 +41,7 @@
.\" ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
.\" SOFTWARE.
.\"
.Dd February 22, 2013
.Dd January 14, 2015
.Dt DEVD.CONF 5
.Os
.Sh NAME
@ -370,6 +370,33 @@ node is destroyed.
.El
.El
.Pp
.It Li GEOM
Events related to the
.Xr geom 4
framework.
The difference compared to
.Li DEVFS
is that
.Li GEOM
only includes disk-like devices.
.Bl -tag -width ".Sy Subsystem" -compact
.It Sy Subsystem
.It Li DEV
.Bl -tag -width ".Li MEDIACHANGE" -compact
.It Sy Type
.It Li CREATE
A
.Xr geom 4
device node is created.
.It Li DESTROY
A
.Xr geom 4
device node is destroyed.
.It Li MEDIACHANGE
Physical media has changed.
.El
.El
.Pp
.It Li USB
Events related to the USB subsystem.
.Bl -tag -width ".Sy Subsystem" -compact

View File

@ -169,12 +169,15 @@ g_dev_destroy(void *arg, int flags __unused)
struct g_consumer *cp;
struct g_geom *gp;
struct g_dev_softc *sc;
char buf[SPECNAMELEN + 6];
g_topology_assert();
cp = arg;
gp = cp->geom;
sc = cp->private;
g_trace(G_T_TOPOLOGY, "g_dev_destroy(%p(%s))", cp, gp->name);
snprintf(buf, sizeof(buf), "cdev=%s", gp->name);
devctl_notify_f("GEOM", "DEV", "DESTROY", buf, M_WAITOK);
if (cp->acr > 0 || cp->acw > 0 || cp->ace > 0)
g_access(cp, -cp->acr, -cp->acw, -cp->ace);
g_detach(cp);
@ -209,11 +212,14 @@ g_dev_attrchanged(struct g_consumer *cp, const char *attr)
dev = sc->sc_dev;
snprintf(buf, sizeof(buf), "cdev=%s", dev->si_name);
devctl_notify_f("DEVFS", "CDEV", "MEDIACHANGE", buf, M_WAITOK);
devctl_notify_f("GEOM", "DEV", "MEDIACHANGE", buf, M_WAITOK);
dev = sc->sc_alias;
if (dev != NULL) {
snprintf(buf, sizeof(buf), "cdev=%s", dev->si_name);
devctl_notify_f("DEVFS", "CDEV", "MEDIACHANGE", buf,
M_WAITOK);
devctl_notify_f("GEOM", "DEV", "MEDIACHANGE", buf,
M_WAITOK);
}
return;
}
@ -269,7 +275,7 @@ g_dev_taste(struct g_class *mp, struct g_provider *pp, int insist __unused)
struct g_dev_softc *sc;
int error, len;
struct cdev *dev, *adev;
char buf[64], *val;
char buf[SPECNAMELEN + 6], *val;
g_trace(G_T_TOPOLOGY, "dev_taste(%s,%s)", mp->name, pp->name);
g_topology_assert();
@ -326,6 +332,8 @@ g_dev_taste(struct g_class *mp, struct g_provider *pp, int insist __unused)
}
g_dev_attrchanged(cp, "GEOM::physpath");
snprintf(buf, sizeof(buf), "cdev=%s", gp->name);
devctl_notify_f("GEOM", "DEV", "CREATE", buf, M_WAITOK);
return (gp);
}