From 5a2c926023263e71a4e891a33bed9473ab858cd9 Mon Sep 17 00:00:00 2001 From: avg Date: Fri, 13 Oct 2017 09:14:05 +0000 Subject: [PATCH] MFC r323612: gmirror: treat ENXIO as disk disconnect, not media error git-svn-id: svn://svn.freebsd.org/base/stable/10@324589 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sys/geom/mirror/g_mirror.c | 12 +++++++++++- sys/geom/mirror/g_mirror.h | 6 ++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/sys/geom/mirror/g_mirror.c b/sys/geom/mirror/g_mirror.c index d9b4e41c6..202d9be4a 100644 --- a/sys/geom/mirror/g_mirror.c +++ b/sys/geom/mirror/g_mirror.c @@ -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); @@ -2480,6 +2486,10 @@ g_mirror_update_device(struct g_mirror_softc *sc, boolean_t force) 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: KASSERT(1 == 0, ("Wrong device state (%s, %s).", diff --git a/sys/geom/mirror/g_mirror.h b/sys/geom/mirror/g_mirror.h index ed499a55c..00f5fd3ab 100644 --- a/sys/geom/mirror/g_mirror.h +++ b/sys/geom/mirror/g_mirror.h @@ -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. */ -- 2.45.0