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-all
mailing list