svn commit: r324589 - stable/10/sys/geom/mirror

Andriy Gapon avg at FreeBSD.org
Fri Oct 13 09:14:06 UTC 2017


Author: avg
Date: Fri Oct 13 09:14:05 2017
New Revision: 324589
URL: https://svnweb.freebsd.org/changeset/base/324589

Log:
  MFC r323612: gmirror: treat ENXIO as disk disconnect, not media error

Modified:
  stable/10/sys/geom/mirror/g_mirror.c
  stable/10/sys/geom/mirror/g_mirror.h
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/geom/mirror/g_mirror.c
==============================================================================
--- stable/10/sys/geom/mirror/g_mirror.c	Fri Oct 13 09:13:08 2017	(r324588)
+++ stable/10/sys/geom/mirror/g_mirror.c	Fri Oct 13 09:14:05 2017	(r324589)
@@ -975,7 +975,13 @@ g_mirror_regular_request(struct bio *bp)
 			if (g_mirror_disconnect_on_failure &&
 			    g_mirror_ndisks(sc, G_MIRROR_DISK_STATE_ACTIVE) > 1)
 			{
-				sc->sc_bump_id |= G_MIRROR_BUMP_GENID;
+				if (bp->bio_error == ENXIO &&
+				    bp->bio_cmd == BIO_READ)
+					sc->sc_bump_id |= G_MIRROR_BUMP_SYNCID;
+				else if (bp->bio_error == ENXIO)
+					sc->sc_bump_id |= G_MIRROR_BUMP_SYNCID_NOW;
+				else
+					sc->sc_bump_id |= G_MIRROR_BUMP_GENID;
 				g_mirror_event_send(disk,
 				    G_MIRROR_DISK_STATE_DISCONNECTED,
 				    G_MIRROR_EVENT_DONTWAIT);
@@ -2479,6 +2485,10 @@ g_mirror_update_device(struct g_mirror_softc *sc, bool
 		if ((sc->sc_bump_id & G_MIRROR_BUMP_GENID) != 0) {
 			sc->sc_bump_id &= ~G_MIRROR_BUMP_GENID;
 			g_mirror_bump_genid(sc);
+		}
+		if ((sc->sc_bump_id & G_MIRROR_BUMP_SYNCID_NOW) != 0) {
+			sc->sc_bump_id &= ~G_MIRROR_BUMP_SYNCID_NOW;
+			g_mirror_bump_syncid(sc);
 		}
 		break;
 	default:

Modified: stable/10/sys/geom/mirror/g_mirror.h
==============================================================================
--- stable/10/sys/geom/mirror/g_mirror.h	Fri Oct 13 09:13:08 2017	(r324588)
+++ stable/10/sys/geom/mirror/g_mirror.h	Fri Oct 13 09:14:05 2017	(r324589)
@@ -166,9 +166,11 @@ struct g_mirror_event {
 #define	G_MIRROR_DEVICE_STATE_RUNNING		1
 
 /* Bump syncid on first write. */
-#define	G_MIRROR_BUMP_SYNCID	0x1
+#define	G_MIRROR_BUMP_SYNCID		0x1
 /* Bump genid immediately. */
-#define	G_MIRROR_BUMP_GENID	0x2
+#define	G_MIRROR_BUMP_GENID		0x2
+/* Bump syncid immediately. */
+#define	G_MIRROR_BUMP_SYNCID_NOW	0x4
 struct g_mirror_softc {
 	u_int		sc_state;	/* Device state. */
 	uint32_t	sc_slice;	/* Slice size. */


More information about the svn-src-stable mailing list