Print this page
Fixup merge results
re #12393 rb3935 Kerberos and smbd disagree about who is our AD server (fix elf runtime attributes check)
re #11612 rb3907 Failing vdev of a mirrored pool should not take zfs operations out of action for extended periods of time.
        
@@ -19,14 +19,12 @@
  * CDDL HEADER END
  */
 /*
  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
- */
-
-/*
  * Copyright (c) 2012 by Delphix. All rights reserved.
+ * Copyright 2012 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #include <sys/spa.h>
 #include <sys/spa_impl.h>
 #include <sys/vdev.h>
@@ -303,12 +301,23 @@
                  * If the 'size' parameter is non-zero, it indicates this is a
                  * RAID-Z or other I/O where the physical offset and length are
                  * provided for us, instead of within the zio_t.
                  */
                 if (vd != NULL) {
-                        if (size)
+                        /*
+                         * The 'stateoroffset' and 'size' parameters are
+                         * overloaded to represent the timeout and latency,
+                         * respectively, in a timeout report.
+                         */
+                        if (strcmp(subclass, FM_EREPORT_ZFS_TIMEOUT) == 0)
                                 fm_payload_set(ereport,
+                                    FM_EREPORT_PAYLOAD_ZFS_ZIO_TIMEOUT,
+                                    DATA_TYPE_UINT64, stateoroffset,
+                                    FM_EREPORT_PAYLOAD_ZFS_ZIO_LATENCY,
+                                    DATA_TYPE_UINT64, size, NULL);
+                        else if (size)
+                                fm_payload_set(ereport,
                                     FM_EREPORT_PAYLOAD_ZFS_ZIO_OFFSET,
                                     DATA_TYPE_UINT64, stateoroffset,
                                     FM_EREPORT_PAYLOAD_ZFS_ZIO_SIZE,
                                     DATA_TYPE_UINT64, size, NULL);
                         else
@@ -358,12 +367,12 @@
 
 #define MAX_RANGES              16
 
 typedef struct zfs_ecksum_info {
         /* histograms of set and cleared bits by bit number in a 64-bit word */
-        uint32_t zei_histogram_set[sizeof (uint64_t) * NBBY];
-        uint32_t zei_histogram_cleared[sizeof (uint64_t) * NBBY];
+        uint16_t zei_histogram_set[sizeof (uint64_t) * NBBY];
+        uint16_t zei_histogram_cleared[sizeof (uint64_t) * NBBY];
 
         /* inline arrays of bits set and cleared. */
         uint64_t zei_bits_set[ZFM_MAX_INLINE];
         uint64_t zei_bits_cleared[ZFM_MAX_INLINE];
 
@@ -384,11 +393,11 @@
         uint32_t zei_allowed_mingap;
 
 } zfs_ecksum_info_t;
 
 static void
-update_histogram(uint64_t value_arg, uint32_t *hist, uint32_t *count)
+update_histogram(uint64_t value_arg, uint16_t *hist, uint32_t *count)
 {
         size_t i;
         size_t bits = 0;
         uint64_t value = BE_64(value_arg);
 
@@ -550,11 +559,11 @@
         }
 
         if (badbuf == NULL || goodbuf == NULL)
                 return (eip);
 
-        ASSERT3U(nui64s, <=, UINT32_MAX);
+        ASSERT3U(nui64s, <=, UINT16_MAX);
         ASSERT3U(size, ==, nui64s * sizeof (uint64_t));
         ASSERT3U(size, <=, SPA_MAXBLOCKSIZE);
         ASSERT3U(size, <=, UINT32_MAX);
 
         /* build up the range list by comparing the two buffers. */
@@ -652,14 +661,14 @@
                     inline_size, (uint8_t *)eip->zei_bits_cleared,
                     NULL);
         } else {
                 fm_payload_set(ereport,
                     FM_EREPORT_PAYLOAD_ZFS_BAD_SET_HISTOGRAM,
-                    DATA_TYPE_UINT32_ARRAY,
+                    DATA_TYPE_UINT16_ARRAY,
                     NBBY * sizeof (uint64_t), eip->zei_histogram_set,
                     FM_EREPORT_PAYLOAD_ZFS_BAD_CLEARED_HISTOGRAM,
-                    DATA_TYPE_UINT32_ARRAY,
+                    DATA_TYPE_UINT16_ARRAY,
                     NBBY * sizeof (uint64_t), eip->zei_histogram_cleared,
                     NULL);
         }
         return (eip);
 }