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
This commit is contained in:
parent
b2fd098e58
commit
40c5032d32
@ -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_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);
|
||||
@ -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).",
|
||||
|
Loading…
Reference in New Issue
Block a user