Author: ae
Date: Fri May 18 09:19:07 2012
New Revision: 235599
URL: http://svn.freebsd.org/changeset/base/235599

Log:
  Introduce new device flag G_MIRROR_DEVICE_FLAG_TASTING. It should
  protect geom from destroying while it is tasting.
  
  PR:           kern/154860
  Reviewed by:  pjd
  MFC after:    1 week

Modified:
  head/sys/geom/mirror/g_mirror.c
  head/sys/geom/mirror/g_mirror.h

Modified: head/sys/geom/mirror/g_mirror.c
==============================================================================
--- head/sys/geom/mirror/g_mirror.c     Fri May 18 05:36:04 2012        
(r235598)
+++ head/sys/geom/mirror/g_mirror.c     Fri May 18 09:19:07 2012        
(r235599)
@@ -1693,6 +1693,8 @@ g_mirror_can_destroy(struct g_mirror_sof
        gp = sc->sc_geom;
        if (gp->softc == NULL)
                return (1);
+       if ((sc->sc_flags & G_MIRROR_DEVICE_FLAG_TASTING) != 0)
+               return (0);
        LIST_FOREACH(cp, &gp->consumer, consumer) {
                if (g_mirror_is_busy(sc, cp))
                        return (0);
@@ -3054,6 +3056,7 @@ g_mirror_taste(struct g_class *mp, struc
        G_MIRROR_DEBUG(1, "Adding disk %s to %s.", pp->name, gp->name);
        g_topology_unlock();
        sx_xlock(&sc->sc_lock);
+       sc->sc_flags |= G_MIRROR_DEVICE_FLAG_TASTING;
        error = g_mirror_add_disk(sc, pp, &md);
        if (error != 0) {
                G_MIRROR_DEBUG(0, "Cannot add disk %s to %s (error=%d).",
@@ -3066,6 +3069,12 @@ g_mirror_taste(struct g_class *mp, struc
                }
                gp = NULL;
        }
+       sc->sc_flags &= ~G_MIRROR_DEVICE_FLAG_TASTING;
+       if ((sc->sc_flags & G_MIRROR_DEVICE_FLAG_DESTROY) != 0) {
+               g_mirror_destroy(sc, G_MIRROR_DESTROY_HARD);
+               g_topology_lock();
+               return (NULL);
+       }
        sx_xunlock(&sc->sc_lock);
        g_topology_lock();
        return (gp);

Modified: head/sys/geom/mirror/g_mirror.h
==============================================================================
--- head/sys/geom/mirror/g_mirror.h     Fri May 18 05:36:04 2012        
(r235598)
+++ head/sys/geom/mirror/g_mirror.h     Fri May 18 09:19:07 2012        
(r235599)
@@ -157,6 +157,7 @@ struct g_mirror_event {
 #define        G_MIRROR_DEVICE_FLAG_DESTROY    0x0100000000000000ULL
 #define        G_MIRROR_DEVICE_FLAG_WAIT       0x0200000000000000ULL
 #define        G_MIRROR_DEVICE_FLAG_DESTROYING 0x0400000000000000ULL
+#define        G_MIRROR_DEVICE_FLAG_TASTING    0x0800000000000000ULL
 
 #define        G_MIRROR_DEVICE_STATE_STARTING          0
 #define        G_MIRROR_DEVICE_STATE_RUNNING           1
_______________________________________________
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