Convert gpioc to use the make_dev_s(9) KPI. This fix a possible race where

si_drv1 can be accessed before it gets set.

This is inspired on r311700.

MFC after:	3 days
This commit is contained in:
loos 2017-01-08 20:41:32 +00:00
parent 5ff8fca605
commit bc99dd2260

View File

@ -78,18 +78,25 @@ gpioc_probe(device_t dev)
static int
gpioc_attach(device_t dev)
{
struct gpioc_softc *sc = device_get_softc(dev);
int err;
struct gpioc_softc *sc;
struct make_dev_args devargs;
sc = device_get_softc(dev);
sc->sc_dev = dev;
sc->sc_pdev = device_get_parent(dev);
sc->sc_unit = device_get_unit(dev);
sc->sc_ctl_dev = make_dev(&gpioc_cdevsw, sc->sc_unit,
UID_ROOT, GID_WHEEL, 0600, "gpioc%d", sc->sc_unit);
if (!sc->sc_ctl_dev) {
make_dev_args_init(&devargs);
devargs.mda_devsw = &gpioc_cdevsw;
devargs.mda_uid = UID_ROOT;
devargs.mda_gid = GID_WHEEL;
devargs.mda_mode = 0600;
devargs.mda_si_drv1 = sc;
err = make_dev_s(&devargs, &sc->sc_ctl_dev, "gpioc%d", sc->sc_unit);
if (err != 0) {
printf("Failed to create gpioc%d", sc->sc_unit);
return (ENXIO);
}
sc->sc_ctl_dev->si_drv1 = sc;
return (0);
}