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

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

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

Modified: stable/11/sys/geom/mirror/g_mirror.c
==============================================================================
--- stable/11/sys/geom/mirror/g_mirror.c        Fri Oct 13 09:11:24 2017        
(r324587)
+++ stable/11/sys/geom/mirror/g_mirror.c        Fri Oct 13 09:13:08 2017        
(r324588)
@@ -982,7 +982,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);
@@ -2505,6 +2511,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/11/sys/geom/mirror/g_mirror.h
==============================================================================
--- stable/11/sys/geom/mirror/g_mirror.h        Fri Oct 13 09:11:24 2017        
(r324587)
+++ stable/11/sys/geom/mirror/g_mirror.h        Fri Oct 13 09:13:08 2017        
(r324588)
@@ -169,9 +169,11 @@ struct g_mirror_event {
 #define        G_MIRROR_TYPE_AUTOMATIC 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_type;        /* Device type (manual/automatic). */
        u_int           sc_state;       /* Device state. */
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to