3246 ZFS I/O deadman thread
[zfs.git] / cmd / zinject / translate.c
index cd967a8..fc16127 100644 (file)
@@ -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>
@@ -115,7 +116,7 @@ parse_pathname(const char *inpath, char *dataset, char *relpath,
        }
 
        if ((fp = fopen(MNTTAB, "r")) == NULL) {
-               (void) fprintf(stderr, "cannot open /etc/mnttab\n");
+               (void) fprintf(stderr, "cannot open /etc/mtab\n");
                return (-1);
        }
 
@@ -233,6 +234,8 @@ calculate_range(const char *dataset, err_type_t type, int level, char *range,
        }
 
        switch (type) {
+       default:
+               break;
        case TYPE_DATA:
                break;
 
@@ -267,7 +270,7 @@ calculate_range(const char *dataset, err_type_t type, int level, char *range,
        }
 
        if (record->zi_object == 0) {
-               dn = os->os_meta_dnode;
+               dn = DMU_META_DNODE(os);
        } else {
                err = dnode_hold(os, record->zi_object, FTAG, &dn);
                if (err != 0) {
@@ -318,7 +321,7 @@ calculate_range(const char *dataset, err_type_t type, int level, char *range,
        ret = 0;
 out:
        if (dn) {
-               if (dn != os->os_meta_dnode)
+               if (dn != DMU_META_DNODE(os))
                        dnode_rele(dn, FTAG);
        }
        if (os)
@@ -347,6 +350,8 @@ translate_record(err_type_t type, const char *object, const char *range,
                 * MOS objects are treated specially.
                 */
                switch (type) {
+               default:
+                       break;
                case TYPE_MOS:
                        record->zi_type = 0;
                        break;
@@ -472,7 +477,23 @@ 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) {
+       default:
+               break;
        case TYPE_LABEL_UBERBLOCK:
                record->zi_start = offsetof(vdev_label_t, vl_uberblock[0]);
                record->zi_end = record->zi_start + VDEV_UBERBLOCK_RING - 1;