diff options
author | mm <mm@FreeBSD.org> | 2013-02-25 12:33:31 +0000 |
---|---|---|
committer | mm <mm@FreeBSD.org> | 2013-02-25 12:33:31 +0000 |
commit | 935fd1194aa4a1bf2f3e80315a915faa331dc729 (patch) | |
tree | ec42bfc38bb1575d8989dd9b950b2a8672bdf3cd /cddl/contrib/opensolaris/cmd/zinject/translate.c | |
parent | 75d62de01add614d86b5cf30bd3b8157f26d2812 (diff) | |
download | FreeBSD-src-935fd1194aa4a1bf2f3e80315a915faa331dc729.zip FreeBSD-src-935fd1194aa4a1bf2f3e80315a915faa331dc729.tar.gz |
MFV v242732:
Merge the ZFS I/O deadman thread from vendor (illumos).
This feature panics the system on hanging ZFS I/O, helps debugging
and resumes failed service.
The panic behavior can be controlled with the loader-only tunables:
vfs.zfs.deadman_enabled (enable or disable panic on stalled ZFS I/O)
vfs.zfs.deadman_synctime (expiration time for stalled ZFS I/O)
By default, ZFS I/O deadman is enabled by default on amd64 and i386
excluding virtual guest machines.
Illumos ZFS issues:
3246 ZFS I/O deadman thread
References:
https://www.illumos.org/issues/3246
MFC after: 2 weeks
Diffstat (limited to 'cddl/contrib/opensolaris/cmd/zinject/translate.c')
-rw-r--r-- | cddl/contrib/opensolaris/cmd/zinject/translate.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/cddl/contrib/opensolaris/cmd/zinject/translate.c b/cddl/contrib/opensolaris/cmd/zinject/translate.c index 442f220..af25d3c 100644 --- a/cddl/contrib/opensolaris/cmd/zinject/translate.c +++ b/cddl/contrib/opensolaris/cmd/zinject/translate.c @@ -20,6 +20,7 @@ */ /* * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 by Delphix. All rights reserved. */ #include <libzfs.h> @@ -455,6 +456,20 @@ translate_device(const char *pool, const char *device, err_type_t label_type, &record->zi_guid) == 0); } + /* + * Device faults can take on three different forms: + * 1). delayed or hanging I/O + * 2). zfs label faults + * 3). generic disk faults + */ + if (record->zi_timer != 0) { + record->zi_cmd = ZINJECT_DELAY_IO; + } else if (label_type != TYPE_INVAL) { + record->zi_cmd = ZINJECT_LABEL_FAULT; + } else { + record->zi_cmd = ZINJECT_DEVICE_FAULT; + } + switch (label_type) { case TYPE_LABEL_UBERBLOCK: record->zi_start = offsetof(vdev_label_t, vl_uberblock[0]); |