Changeset View
Changeset View
Standalone View
Standalone View
head/sys/geom/geom_dev.c
Show First 20 Lines • Show All 330 Lines • ▼ Show 20 Lines | g_dev_taste(struct g_class *mp, struct g_provider *pp, int insist __unused) | ||||
struct g_geom *gp; | struct g_geom *gp; | ||||
struct g_geom_alias *gap; | struct g_geom_alias *gap; | ||||
struct g_consumer *cp; | struct g_consumer *cp; | ||||
struct g_dev_softc *sc; | struct g_dev_softc *sc; | ||||
int error; | int error; | ||||
struct cdev *dev, *adev; | struct cdev *dev, *adev; | ||||
char buf[SPECNAMELEN + 6]; | char buf[SPECNAMELEN + 6]; | ||||
struct make_dev_args args; | struct make_dev_args args; | ||||
bool retaste; | |||||
g_trace(G_T_TOPOLOGY, "dev_taste(%s,%s)", mp->name, pp->name); | g_trace(G_T_TOPOLOGY, "dev_taste(%s,%s)", mp->name, pp->name); | ||||
g_topology_assert(); | g_topology_assert(); | ||||
/* Only one geom_dev per provider. */ | |||||
LIST_FOREACH(cp, &pp->consumers, consumers) { | |||||
if (cp->geom->class != mp || (cp->flags & G_CF_SPOILED)) | |||||
continue; | |||||
gp = cp->geom; | |||||
sc = cp->private; | |||||
dev = sc->sc_dev; | |||||
retaste = true; | |||||
goto aliases; | |||||
} | |||||
gp = g_new_geomf(mp, "%s", pp->name); | gp = g_new_geomf(mp, "%s", pp->name); | ||||
sc = g_malloc(sizeof(*sc), M_WAITOK | M_ZERO); | sc = g_malloc(sizeof(*sc), M_WAITOK | M_ZERO); | ||||
mtx_init(&sc->sc_mtx, "g_dev", NULL, MTX_DEF); | mtx_init(&sc->sc_mtx, "g_dev", NULL, MTX_DEF); | ||||
cp = g_new_consumer(gp); | cp = g_new_consumer(gp); | ||||
cp->private = sc; | cp->private = sc; | ||||
cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE; | cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE; | ||||
error = g_attach(cp, pp); | error = g_attach(cp, pp); | ||||
KASSERT(error == 0, | KASSERT(error == 0, | ||||
Show All 25 Lines | g_dev_taste(struct g_class *mp, struct g_provider *pp, int insist __unused) | ||||
error = init_dumpdev(dev); | error = init_dumpdev(dev); | ||||
if (error != 0) | if (error != 0) | ||||
printf("%s: init_dumpdev() failed (gp->name=%s, error=%d)\n", | printf("%s: init_dumpdev() failed (gp->name=%s, error=%d)\n", | ||||
__func__, gp->name, error); | __func__, gp->name, error); | ||||
g_dev_attrchanged(cp, "GEOM::physpath"); | g_dev_attrchanged(cp, "GEOM::physpath"); | ||||
snprintf(buf, sizeof(buf), "cdev=%s", gp->name); | snprintf(buf, sizeof(buf), "cdev=%s", gp->name); | ||||
devctl_notify_f("GEOM", "DEV", "CREATE", buf, M_WAITOK); | devctl_notify_f("GEOM", "DEV", "CREATE", buf, M_WAITOK); | ||||
retaste = false; | |||||
aliases: | |||||
/* | /* | ||||
* Now add all the aliases for this drive | * Now add all the aliases for this drive | ||||
*/ | */ | ||||
LIST_FOREACH(gap, &pp->aliases, ga_next) { | LIST_FOREACH(gap, &pp->aliases, ga_next) { | ||||
error = make_dev_alias_p(MAKEDEV_CHECKNAME | MAKEDEV_WAITOK, &adev, dev, | error = make_dev_alias_p(MAKEDEV_CHECKNAME | MAKEDEV_WAITOK, &adev, dev, | ||||
"%s", gap->ga_alias); | "%s", gap->ga_alias); | ||||
if (error) { | if (error) { | ||||
printf("%s: make_dev_alias_p() failed (name=%s, error=%d)\n", | /* | ||||
__func__, gap->ga_alias, error); | * With aliases added after initial taste, we don't | ||||
* know which aliases are new in this retaste, so we | |||||
* try to create all of them. EEXIST is expected and | |||||
* silently ignored or else this becomes really spammy. | |||||
*/ | |||||
if (error != EEXIST || !retaste) | |||||
printf("%s: make_dev_alias_p() failed (name=%s," | |||||
" error=%d)\n", __func__, gap->ga_alias, | |||||
error); | |||||
continue; | continue; | ||||
} | } | ||||
snprintf(buf, sizeof(buf), "cdev=%s", gap->ga_alias); | snprintf(buf, sizeof(buf), "cdev=%s", gap->ga_alias); | ||||
devctl_notify_f("GEOM", "DEV", "CREATE", buf, M_WAITOK); | devctl_notify_f("GEOM", "DEV", "CREATE", buf, M_WAITOK); | ||||
} | } | ||||
return (gp); | return (gp); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 500 Lines • Show Last 20 Lines |