Author: ngie
Date: Sat Oct  7 23:06:49 2017
New Revision: 324402
URL: https://svnweb.freebsd.org/changeset/base/324402

Log:
  MFC r305508:
  r305508 (by markj):
  
  Add some fail points to gmirror.
  
  These are useful for testing changes to I/O error handling, and for
  reproducing existing bugs in a controlled manner. The fail points are
  
      g_mirror_regular_request_read
      g_mirror_regular_request_write
      g_mirror_sync_request_read
      g_mirror_sync_request_write
      g_mirror_metadata_write
  
  They all effectively allow one to inject an error value into the bio_error
  field of a corresponding BIO request as it is being completed.

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

Modified: stable/11/sys/geom/mirror/g_mirror.c
==============================================================================
--- stable/11/sys/geom/mirror/g_mirror.c        Sat Oct  7 22:59:09 2017        
(r324401)
+++ stable/11/sys/geom/mirror/g_mirror.c        Sat Oct  7 23:06:49 2017        
(r324402)
@@ -29,6 +29,7 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
 #include <sys/systm.h>
+#include <sys/fail.h>
 #include <sys/kernel.h>
 #include <sys/module.h>
 #include <sys/limits.h>
@@ -665,6 +666,7 @@ g_mirror_write_metadata(struct g_mirror_disk *disk,
                else
                        mirror_metadata_encode(md, sector);
        }
+       KFAIL_POINT_ERROR(DEBUG_FP, g_mirror_metadata_write, error);
        if (error == 0)
                error = g_write_data(cp, offset, sector, length);
        free(sector, M_MIRROR);
@@ -937,6 +939,13 @@ g_mirror_regular_request(struct bio *bp)
                g_topology_unlock();
        }
 
+       if (bp->bio_cmd == BIO_READ)
+               KFAIL_POINT_ERROR(DEBUG_FP, g_mirror_regular_request_read,
+                   bp->bio_error);
+       else if (bp->bio_cmd == BIO_WRITE)
+               KFAIL_POINT_ERROR(DEBUG_FP, g_mirror_regular_request_write,
+                   bp->bio_error);
+
        pbp->bio_inbed++;
        KASSERT(pbp->bio_inbed <= pbp->bio_children,
            ("bio_inbed (%u) is bigger than bio_children (%u).", pbp->bio_inbed,
@@ -1331,6 +1340,9 @@ g_mirror_sync_request(struct bio *bp)
            {
                struct g_consumer *cp;
 
+               KFAIL_POINT_ERROR(DEBUG_FP, g_mirror_sync_request_read,
+                   bp->bio_error);
+
                if (bp->bio_error != 0) {
                        G_MIRROR_LOGREQ(0, bp,
                            "Synchronization request failed (error=%d).",
@@ -1356,6 +1368,9 @@ g_mirror_sync_request(struct bio *bp)
                off_t offset;
                void *data;
                int i;
+
+               KFAIL_POINT_ERROR(DEBUG_FP, g_mirror_sync_request_write,
+                   bp->bio_error);
 
                if (bp->bio_error != 0) {
                        G_MIRROR_LOGREQ(0, bp,
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to