Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 6 Sep 2016 23:35:48 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r305508 - head/sys/geom/mirror
Message-ID:  <201609062335.u86NZmRE083029@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Tue Sep  6 23:35:48 2016
New Revision: 305508
URL: https://svnweb.freebsd.org/changeset/base/305508

Log:
  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.
  
  MFC after:	2 weeks
  Sponsored by:	EMC / Isilon Storage Division

Modified:
  head/sys/geom/mirror/g_mirror.c

Modified: head/sys/geom/mirror/g_mirror.c
==============================================================================
--- head/sys/geom/mirror/g_mirror.c	Tue Sep  6 22:18:08 2016	(r305507)
+++ head/sys/geom/mirror/g_mirror.c	Tue Sep  6 23:35:48 2016	(r305508)
@@ -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>
@@ -646,6 +647,7 @@ g_mirror_write_metadata(struct g_mirror_
 		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);
@@ -914,6 +916,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,
@@ -1308,6 +1317,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).",
@@ -1334,6 +1346,9 @@ g_mirror_sync_request(struct bio *bp)
 		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,
 			    "Synchronization request failed (error=%d).",



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201609062335.u86NZmRE083029>