Author: attilio
Date: Wed Sep 15 14:24:21 2010
New Revision: 212661
URL: http://svn.freebsd.org/changeset/base/212661

Log:
  Fix bogus busying mechanism from cdevsw callbacks:
  - D_TRACKCLOSE may be used there as d_close() are expected to match up
    d_open() calls
  - Replace the hand-crafted counter and flag with the
    device_busy()/device_unbusy() proper usage.
  
  Sponsored by: Sandvine Incorporated
  Reported by:  Mark Johnston <mjohnston at sandvine dot com>
  Tested by:    Mark Johnston
  Reviewed by:  emaste
  
  MFC after:    10 days

Modified:
  head/sys/dev/aac/aac.c
  head/sys/dev/aac/aacvar.h

Modified: head/sys/dev/aac/aac.c
==============================================================================
--- head/sys/dev/aac/aac.c      Wed Sep 15 14:23:55 2010        (r212660)
+++ head/sys/dev/aac/aac.c      Wed Sep 15 14:24:21 2010        (r212661)
@@ -212,7 +212,7 @@ static struct aac_mntinforesp *
 
 static struct cdevsw aac_cdevsw = {
        .d_version =    D_VERSION,
-       .d_flags =      D_NEEDGIANT,
+       .d_flags =      D_NEEDGIANT | D_TRACKCLOSE,
        .d_open =       aac_open,
        .d_close =      aac_close,
        .d_ioctl =      aac_ioctl,
@@ -660,9 +660,6 @@ aac_detach(device_t dev)
        sc = device_get_softc(dev);
        fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, "");
 
-       if (sc->aac_state & AAC_STATE_OPEN)
-               return(EBUSY);
-
        callout_drain(&sc->aac_daemontime);
 
        /* Remove the child containers */
@@ -2804,8 +2801,7 @@ aac_open(struct cdev *dev, int flags, in
 
        sc = dev->si_drv1;
        fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, "");
-       sc->aac_open_cnt++;
-       sc->aac_state |= AAC_STATE_OPEN;
+       device_busy(sc->aac_dev);
 
        return 0;
 }
@@ -2817,10 +2813,7 @@ aac_close(struct cdev *dev, int flags, i
 
        sc = dev->si_drv1;
        fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, "");
-       sc->aac_open_cnt--;
-       /* Mark this unit as no longer open  */
-       if (sc->aac_open_cnt == 0)
-               sc->aac_state &= ~AAC_STATE_OPEN;
+       device_unbusy(sc->aac_dev);
 
        return 0;
 }

Modified: head/sys/dev/aac/aacvar.h
==============================================================================
--- head/sys/dev/aac/aacvar.h   Wed Sep 15 14:23:55 2010        (r212660)
+++ head/sys/dev/aac/aacvar.h   Wed Sep 15 14:24:21 2010        (r212661)
@@ -319,10 +319,9 @@ struct aac_softc
        /* controller features, limits and status */
        int                     aac_state;
 #define AAC_STATE_SUSPEND      (1<<0)
-#define        AAC_STATE_OPEN          (1<<1)
+#define        AAC_STATE_UNUSED0       (1<<1)
 #define AAC_STATE_INTERRUPTS_ON        (1<<2)
 #define AAC_STATE_AIF_SLEEPER  (1<<3)
-       int                     aac_open_cnt;
        struct FsaRevision              aac_revision;
 
        /* controller hardware interface */
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to