]> granicus.if.org Git - zfs/commitdiff
Generate zevents for speculative and soft errors
authorBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 27 Sep 2010 23:55:05 +0000 (16:55 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 12 Oct 2010 21:55:00 +0000 (14:55 -0700)
By default the Solaris code does not log speculative or soft io errors
in either 'zpool status' or post an event.  Under Linux we don't want
to change the expected behavior of 'zpool status' so these io errors
are still suppressed there.

However, since we do need to know about these events for Linux FMA and
the 'zpool events' interface is new we do post the events.  With the
addition of the zio_flags field the posted events now contain enough
information that a user space consumer can identify and discard these
events if it sees fit.

include/sys/fm/fs/zfs.h
module/zfs/zfs_fm.c

index d5c71d1744185df3061f3a6dbf252001dfa4bbc5..d157ea15331d7a97ca381dca1ee4894c506efcad 100644 (file)
@@ -80,6 +80,7 @@ extern "C" {
 #define        FM_EREPORT_PAYLOAD_ZFS_ZIO_ERR          "zio_err"
 #define        FM_EREPORT_PAYLOAD_ZFS_ZIO_OFFSET       "zio_offset"
 #define        FM_EREPORT_PAYLOAD_ZFS_ZIO_SIZE         "zio_size"
+#define        FM_EREPORT_PAYLOAD_ZFS_ZIO_FLAGS        "zio_flags"
 #define        FM_EREPORT_PAYLOAD_ZFS_PREV_STATE       "prev_state"
 #define        FM_EREPORT_PAYLOAD_ZFS_CKSUM_EXPECTED   "cksum_expected"
 #define        FM_EREPORT_PAYLOAD_ZFS_CKSUM_ACTUAL     "cksum_actual"
index c93057e8e8d1654f2f75b9e1110c07f75f9f5095..dd15c5d634f4c0c66b75b9c08333aba2090e4cba 100644 (file)
@@ -144,22 +144,6 @@ zfs_ereport_start(nvlist_t **ereport_out, nvlist_t **detector_out,
                    zio->io_type != ZIO_TYPE_WRITE)
                        return;
 
-               /*
-                * Ignore any errors from speculative I/Os, as failure is an
-                * expected result.
-                */
-               if (zio->io_flags & ZIO_FLAG_SPECULATIVE)
-                       return;
-
-               /*
-                * If this I/O is not a retry I/O, don't post an ereport.
-                * Otherwise, we risk making bad diagnoses based on B_FAILFAST
-                * I/Os.
-                */
-               if (zio->io_error == EIO &&
-                   !(zio->io_flags & ZIO_FLAG_IO_RETRY))
-                       return;
-
                if (vd != NULL) {
                        /*
                         * If the vdev has already been marked as failing due
@@ -304,6 +288,8 @@ zfs_ereport_start(nvlist_t **ereport_out, nvlist_t **detector_out,
                 */
                fm_payload_set(ereport, FM_EREPORT_PAYLOAD_ZFS_ZIO_ERR,
                    DATA_TYPE_INT32, zio->io_error, NULL);
+               fm_payload_set(ereport, FM_EREPORT_PAYLOAD_ZFS_ZIO_FLAGS,
+                   DATA_TYPE_INT32, zio->io_flags, NULL);
 
                /*
                 * If the 'size' parameter is non-zero, it indicates this is a