Author: loos
Date: Fri Jan 13 03:12:00 2017
New Revision: 312006
URL: https://svnweb.freebsd.org/changeset/base/312006

Log:
  MFC r311701:
  
  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 was inspired on r311700.

Modified:
  stable/11/sys/dev/gpio/gpioc.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/dev/gpio/gpioc.c
==============================================================================
--- stable/11/sys/dev/gpio/gpioc.c      Fri Jan 13 03:08:05 2017        
(r312005)
+++ stable/11/sys/dev/gpio/gpioc.c      Fri Jan 13 03:12:00 2017        
(r312006)
@@ -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);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to