svn commit: r235599 - head/sys/geom/mirror

Andrey V. Elsukov ae at FreeBSD.org
Fri May 18 09:19:08 UTC 2012


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


More information about the svn-src-all mailing list