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

Conrad Meyer cem at FreeBSD.org
Wed Dec 12 05:48:28 UTC 2018


Author: cem
Date: Wed Dec 12 05:48:27 2018
New Revision: 341840
URL: https://svnweb.freebsd.org/changeset/base/341840

Log:
  gmirror: Fix a bug introduced in r341674
  
  r341674 inadvertently introduced a bug where newer mirror components being
  tasted would clear the high sc_flags that are not controlled by component
  metadata, such as G_MIRROR_DEVICE_FLAG_TASTING.  This could plausibly expose
  a small window of time during STARTING where device destruction might race
  with mirror component addition, probably resulting in a crash.
  
  Reviewed by:	markj
  X-MFC-With:	r341674
  Differential Revision:	https://reviews.freebsd.org/D18521

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

Modified: head/sys/geom/mirror/g_mirror.c
==============================================================================
--- head/sys/geom/mirror/g_mirror.c	Wed Dec 12 05:18:53 2018	(r341839)
+++ head/sys/geom/mirror/g_mirror.c	Wed Dec 12 05:48:27 2018	(r341840)
@@ -3061,6 +3061,8 @@ g_mirror_reinit_from_metadata(struct g_mirror_softc *s
     const struct g_mirror_metadata *md)
 {
 
+	sx_assert(&sc->sc_lock, SX_XLOCKED);
+
 	sc->sc_genid = md->md_genid;
 	sc->sc_syncid = md->md_syncid;
 
@@ -3068,7 +3070,8 @@ g_mirror_reinit_from_metadata(struct g_mirror_softc *s
 	sc->sc_balance = md->md_balance;
 	sc->sc_mediasize = md->md_mediasize;
 	sc->sc_ndisks = md->md_all;
-	sc->sc_flags = md->md_mflags;
+	sc->sc_flags &= ~G_MIRROR_DEVICE_FLAG_MASK;
+	sc->sc_flags |= (md->md_mflags & G_MIRROR_DEVICE_FLAG_MASK);
 }
 
 struct g_geom *


More information about the svn-src-all mailing list