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. */
_______________________________________________
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