Generate zevents for speculative and soft errors
[zfs.git] / module / zfs / zfs_fm.c
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25
26 #include <sys/spa.h>
27 #include <sys/spa_impl.h>
28 #include <sys/vdev.h>
29 #include <sys/vdev_impl.h>
30 #include <sys/zio.h>
31 #include <sys/zio_checksum.h>
32
33 #include <sys/fm/fs/zfs.h>
34 #include <sys/fm/protocol.h>
35 #include <sys/fm/util.h>
36 #include <sys/sysevent.h>
37
38 /*
39  * This general routine is responsible for generating all the different ZFS
40  * ereports.  The payload is dependent on the class, and which arguments are
41  * supplied to the function:
42  *
43  *      EREPORT                 POOL    VDEV    IO
44  *      block                   X       X       X
45  *      data                    X               X
46  *      device                  X       X
47  *      pool                    X
48  *
49  * If we are in a loading state, all errors are chained together by the same
50  * SPA-wide ENA (Error Numeric Association).
51  *
52  * For isolated I/O requests, we get the ENA from the zio_t. The propagation
53  * gets very complicated due to RAID-Z, gang blocks, and vdev caching.  We want
54  * to chain together all ereports associated with a logical piece of data.  For
55  * read I/Os, there  are basically three 'types' of I/O, which form a roughly
56  * layered diagram:
57  *
58  *      +---------------+
59  *      | Aggregate I/O |       No associated logical data or device
60  *      +---------------+
61  *              |
62  *              V
63  *      +---------------+       Reads associated with a piece of logical data.
64  *      |   Read I/O    |       This includes reads on behalf of RAID-Z,
65  *      +---------------+       mirrors, gang blocks, retries, etc.
66  *              |
67  *              V
68  *      +---------------+       Reads associated with a particular device, but
69  *      | Physical I/O  |       no logical data.  Issued as part of vdev caching
70  *      +---------------+       and I/O aggregation.
71  *
72  * Note that 'physical I/O' here is not the same terminology as used in the rest
73  * of ZIO.  Typically, 'physical I/O' simply means that there is no attached
74  * blockpointer.  But I/O with no associated block pointer can still be related
75  * to a logical piece of data (i.e. RAID-Z requests).
76  *
77  * Purely physical I/O always have unique ENAs.  They are not related to a
78  * particular piece of logical data, and therefore cannot be chained together.
79  * We still generate an ereport, but the DE doesn't correlate it with any
80  * logical piece of data.  When such an I/O fails, the delegated I/O requests
81  * will issue a retry, which will trigger the 'real' ereport with the correct
82  * ENA.
83  *
84  * We keep track of the ENA for a ZIO chain through the 'io_logical' member.
85  * When a new logical I/O is issued, we set this to point to itself.  Child I/Os
86  * then inherit this pointer, so that when it is first set subsequent failures
87  * will use the same ENA.  For vdev cache fill and queue aggregation I/O,
88  * this pointer is set to NULL, and no ereport will be generated (since it
89  * doesn't actually correspond to any particular device or piece of data,
90  * and the caller will always retry without caching or queueing anyway).
91  *
92  * For checksum errors, we want to include more information about the actual
93  * error which occurs.  Accordingly, we build an ereport when the error is
94  * noticed, but instead of sending it in immediately, we hang it off of the
95  * io_cksum_report field of the logical IO.  When the logical IO completes
96  * (successfully or not), zfs_ereport_finish_checksum() is called with the
97  * good and bad versions of the buffer (if available), and we annotate the
98  * ereport with information about the differences.
99  */
100 #ifdef _KERNEL
101 static void
102 zfs_zevent_post_cb(nvlist_t *nvl, nvlist_t *detector)
103 {
104         if (nvl)
105                 fm_nvlist_destroy(nvl, FM_NVA_FREE);
106
107         if (detector)
108                 fm_nvlist_destroy(detector, FM_NVA_FREE);
109 }
110
111 static void
112 zfs_ereport_start(nvlist_t **ereport_out, nvlist_t **detector_out,
113     const char *subclass, spa_t *spa, vdev_t *vd, zio_t *zio,
114     uint64_t stateoroffset, uint64_t size)
115 {
116         nvlist_t *ereport, *detector;
117
118         uint64_t ena;
119         char class[64];
120
121         /*
122          * If we are doing a spa_tryimport() or in recovery mode,
123          * ignore errors.
124          */
125         if (spa_load_state(spa) == SPA_LOAD_TRYIMPORT ||
126             spa_load_state(spa) == SPA_LOAD_RECOVER)
127                 return;
128
129         /*
130          * If we are in the middle of opening a pool, and the previous attempt
131          * failed, don't bother logging any new ereports - we're just going to
132          * get the same diagnosis anyway.
133          */
134         if (spa_load_state(spa) != SPA_LOAD_NONE &&
135             spa->spa_last_open_failed)
136                 return;
137
138         if (zio != NULL) {
139                 /*
140                  * If this is not a read or write zio, ignore the error.  This
141                  * can occur if the DKIOCFLUSHWRITECACHE ioctl fails.
142                  */
143                 if (zio->io_type != ZIO_TYPE_READ &&
144                     zio->io_type != ZIO_TYPE_WRITE)
145                         return;
146
147                 if (vd != NULL) {
148                         /*
149                          * If the vdev has already been marked as failing due
150                          * to a failed probe, then ignore any subsequent I/O
151                          * errors, as the DE will automatically fault the vdev
152                          * on the first such failure.  This also catches cases
153                          * where vdev_remove_wanted is set and the device has
154                          * not yet been asynchronously placed into the REMOVED
155                          * state.
156                          */
157                         if (zio->io_vd == vd && !vdev_accessible(vd, zio))
158                                 return;
159
160                         /*
161                          * Ignore checksum errors for reads from DTL regions of
162                          * leaf vdevs.
163                          */
164                         if (zio->io_type == ZIO_TYPE_READ &&
165                             zio->io_error == ECKSUM &&
166                             vd->vdev_ops->vdev_op_leaf &&
167                             vdev_dtl_contains(vd, DTL_MISSING, zio->io_txg, 1))
168                                 return;
169                 }
170         }
171
172         /*
173          * For probe failure, we want to avoid posting ereports if we've
174          * already removed the device in the meantime.
175          */
176         if (vd != NULL &&
177             strcmp(subclass, FM_EREPORT_ZFS_PROBE_FAILURE) == 0 &&
178             (vd->vdev_remove_wanted || vd->vdev_state == VDEV_STATE_REMOVED))
179                 return;
180
181         if ((ereport = fm_nvlist_create(NULL)) == NULL)
182                 return;
183
184         if ((detector = fm_nvlist_create(NULL)) == NULL) {
185                 fm_nvlist_destroy(ereport, FM_NVA_FREE);
186                 return;
187         }
188
189         /*
190          * Serialize ereport generation
191          */
192         mutex_enter(&spa->spa_errlist_lock);
193
194         /*
195          * Determine the ENA to use for this event.  If we are in a loading
196          * state, use a SPA-wide ENA.  Otherwise, if we are in an I/O state, use
197          * a root zio-wide ENA.  Otherwise, simply use a unique ENA.
198          */
199         if (spa_load_state(spa) != SPA_LOAD_NONE) {
200                 if (spa->spa_ena == 0)
201                         spa->spa_ena = fm_ena_generate(0, FM_ENA_FMT1);
202                 ena = spa->spa_ena;
203         } else if (zio != NULL && zio->io_logical != NULL) {
204                 if (zio->io_logical->io_ena == 0)
205                         zio->io_logical->io_ena =
206                             fm_ena_generate(0, FM_ENA_FMT1);
207                 ena = zio->io_logical->io_ena;
208         } else {
209                 ena = fm_ena_generate(0, FM_ENA_FMT1);
210         }
211
212         /*
213          * Construct the full class, detector, and other standard FMA fields.
214          */
215         (void) snprintf(class, sizeof (class), "%s.%s",
216             ZFS_ERROR_CLASS, subclass);
217
218         fm_fmri_zfs_set(detector, FM_ZFS_SCHEME_VERSION, spa_guid(spa),
219             vd != NULL ? vd->vdev_guid : 0);
220
221         fm_ereport_set(ereport, FM_EREPORT_VERSION, class, ena, detector, NULL);
222
223         /*
224          * Construct the per-ereport payload, depending on which parameters are
225          * passed in.
226          */
227
228         /*
229          * Generic payload members common to all ereports.
230          */
231         fm_payload_set(ereport, FM_EREPORT_PAYLOAD_ZFS_POOL,
232             DATA_TYPE_STRING, spa_name(spa), FM_EREPORT_PAYLOAD_ZFS_POOL_GUID,
233             DATA_TYPE_UINT64, spa_guid(spa),
234             FM_EREPORT_PAYLOAD_ZFS_POOL_CONTEXT, DATA_TYPE_INT32,
235             spa_load_state(spa), NULL);
236
237         if (spa != NULL) {
238                 fm_payload_set(ereport, FM_EREPORT_PAYLOAD_ZFS_POOL_FAILMODE,
239                     DATA_TYPE_STRING,
240                     spa_get_failmode(spa) == ZIO_FAILURE_MODE_WAIT ?
241                     FM_EREPORT_FAILMODE_WAIT :
242                     spa_get_failmode(spa) == ZIO_FAILURE_MODE_CONTINUE ?
243                     FM_EREPORT_FAILMODE_CONTINUE : FM_EREPORT_FAILMODE_PANIC,
244                     NULL);
245         }
246
247         if (vd != NULL) {
248                 vdev_t *pvd = vd->vdev_parent;
249
250                 fm_payload_set(ereport, FM_EREPORT_PAYLOAD_ZFS_VDEV_GUID,
251                     DATA_TYPE_UINT64, vd->vdev_guid,
252                     FM_EREPORT_PAYLOAD_ZFS_VDEV_TYPE,
253                     DATA_TYPE_STRING, vd->vdev_ops->vdev_op_type, NULL);
254                 if (vd->vdev_path != NULL)
255                         fm_payload_set(ereport,
256                             FM_EREPORT_PAYLOAD_ZFS_VDEV_PATH,
257                             DATA_TYPE_STRING, vd->vdev_path, NULL);
258                 if (vd->vdev_devid != NULL)
259                         fm_payload_set(ereport,
260                             FM_EREPORT_PAYLOAD_ZFS_VDEV_DEVID,
261                             DATA_TYPE_STRING, vd->vdev_devid, NULL);
262                 if (vd->vdev_fru != NULL)
263                         fm_payload_set(ereport,
264                             FM_EREPORT_PAYLOAD_ZFS_VDEV_FRU,
265                             DATA_TYPE_STRING, vd->vdev_fru, NULL);
266
267                 if (pvd != NULL) {
268                         fm_payload_set(ereport,
269                             FM_EREPORT_PAYLOAD_ZFS_PARENT_GUID,
270                             DATA_TYPE_UINT64, pvd->vdev_guid,
271                             FM_EREPORT_PAYLOAD_ZFS_PARENT_TYPE,
272                             DATA_TYPE_STRING, pvd->vdev_ops->vdev_op_type,
273                             NULL);
274                         if (pvd->vdev_path)
275                                 fm_payload_set(ereport,
276                                     FM_EREPORT_PAYLOAD_ZFS_PARENT_PATH,
277                                     DATA_TYPE_STRING, pvd->vdev_path, NULL);
278                         if (pvd->vdev_devid)
279                                 fm_payload_set(ereport,
280                                     FM_EREPORT_PAYLOAD_ZFS_PARENT_DEVID,
281                                     DATA_TYPE_STRING, pvd->vdev_devid, NULL);
282                 }
283         }
284
285         if (zio != NULL) {
286                 /*
287                  * Payload common to all I/Os.
288                  */
289                 fm_payload_set(ereport, FM_EREPORT_PAYLOAD_ZFS_ZIO_ERR,
290                     DATA_TYPE_INT32, zio->io_error, NULL);
291                 fm_payload_set(ereport, FM_EREPORT_PAYLOAD_ZFS_ZIO_FLAGS,
292                     DATA_TYPE_INT32, zio->io_flags, NULL);
293
294                 /*
295                  * If the 'size' parameter is non-zero, it indicates this is a
296                  * RAID-Z or other I/O where the physical offset and length are
297                  * provided for us, instead of within the zio_t.
298                  */
299                 if (vd != NULL) {
300                         if (size)
301                                 fm_payload_set(ereport,
302                                     FM_EREPORT_PAYLOAD_ZFS_ZIO_OFFSET,
303                                     DATA_TYPE_UINT64, stateoroffset,
304                                     FM_EREPORT_PAYLOAD_ZFS_ZIO_SIZE,
305                                     DATA_TYPE_UINT64, size, NULL);
306                         else
307                                 fm_payload_set(ereport,
308                                     FM_EREPORT_PAYLOAD_ZFS_ZIO_OFFSET,
309                                     DATA_TYPE_UINT64, zio->io_offset,
310                                     FM_EREPORT_PAYLOAD_ZFS_ZIO_SIZE,
311                                     DATA_TYPE_UINT64, zio->io_size, NULL);
312                 }
313
314                 /*
315                  * Payload for I/Os with corresponding logical information.
316                  */
317                 if (zio->io_logical != NULL)
318                         fm_payload_set(ereport,
319                             FM_EREPORT_PAYLOAD_ZFS_ZIO_OBJSET,
320                             DATA_TYPE_UINT64,
321                             zio->io_logical->io_bookmark.zb_objset,
322                             FM_EREPORT_PAYLOAD_ZFS_ZIO_OBJECT,
323                             DATA_TYPE_UINT64,
324                             zio->io_logical->io_bookmark.zb_object,
325                             FM_EREPORT_PAYLOAD_ZFS_ZIO_LEVEL,
326                             DATA_TYPE_INT64,
327                             zio->io_logical->io_bookmark.zb_level,
328                             FM_EREPORT_PAYLOAD_ZFS_ZIO_BLKID,
329                             DATA_TYPE_UINT64,
330                             zio->io_logical->io_bookmark.zb_blkid, NULL);
331         } else if (vd != NULL) {
332                 /*
333                  * If we have a vdev but no zio, this is a device fault, and the
334                  * 'stateoroffset' parameter indicates the previous state of the
335                  * vdev.
336                  */
337                 fm_payload_set(ereport,
338                     FM_EREPORT_PAYLOAD_ZFS_PREV_STATE,
339                     DATA_TYPE_UINT64, stateoroffset, NULL);
340         }
341
342         mutex_exit(&spa->spa_errlist_lock);
343
344         *ereport_out = ereport;
345         *detector_out = detector;
346 }
347
348 /* if it's <= 128 bytes, save the corruption directly */
349 #define ZFM_MAX_INLINE          (128 / sizeof (uint64_t))
350
351 #define MAX_RANGES              16
352
353 typedef struct zfs_ecksum_info {
354         /* histograms of set and cleared bits by bit number in a 64-bit word */
355         uint16_t zei_histogram_set[sizeof (uint64_t) * NBBY];
356         uint16_t zei_histogram_cleared[sizeof (uint64_t) * NBBY];
357
358         /* inline arrays of bits set and cleared. */
359         uint64_t zei_bits_set[ZFM_MAX_INLINE];
360         uint64_t zei_bits_cleared[ZFM_MAX_INLINE];
361
362         /*
363          * for each range, the number of bits set and cleared.  The Hamming
364          * distance between the good and bad buffers is the sum of them all.
365          */
366         uint32_t zei_range_sets[MAX_RANGES];
367         uint32_t zei_range_clears[MAX_RANGES];
368
369         struct zei_ranges {
370                 uint32_t        zr_start;
371                 uint32_t        zr_end;
372         } zei_ranges[MAX_RANGES];
373
374         size_t  zei_range_count;
375         uint32_t zei_mingap;
376         uint32_t zei_allowed_mingap;
377
378 } zfs_ecksum_info_t;
379
380 static void
381 update_histogram(uint64_t value_arg, uint16_t *hist, uint32_t *count)
382 {
383         size_t i;
384         size_t bits = 0;
385         uint64_t value = BE_64(value_arg);
386
387         /* We store the bits in big-endian (largest-first) order */
388         for (i = 0; i < 64; i++) {
389                 if (value & (1ull << i)) {
390                         hist[63 - i]++;
391                         ++bits;
392                 }
393         }
394         /* update the count of bits changed */
395         *count += bits;
396 }
397
398 /*
399  * We've now filled up the range array, and need to increase "mingap" and
400  * shrink the range list accordingly.  zei_mingap is always the smallest
401  * distance between array entries, so we set the new_allowed_gap to be
402  * one greater than that.  We then go through the list, joining together
403  * any ranges which are closer than the new_allowed_gap.
404  *
405  * By construction, there will be at least one.  We also update zei_mingap
406  * to the new smallest gap, to prepare for our next invocation.
407  */
408 static void
409 zei_shrink_ranges(zfs_ecksum_info_t *eip)
410 {
411         uint32_t mingap = UINT32_MAX;
412         uint32_t new_allowed_gap = eip->zei_mingap + 1;
413
414         size_t idx, output;
415         size_t max = eip->zei_range_count;
416
417         struct zei_ranges *r = eip->zei_ranges;
418
419         ASSERT3U(eip->zei_range_count, >, 0);
420         ASSERT3U(eip->zei_range_count, <=, MAX_RANGES);
421
422         output = idx = 0;
423         while (idx < max - 1) {
424                 uint32_t start = r[idx].zr_start;
425                 uint32_t end = r[idx].zr_end;
426
427                 while (idx < max - 1) {
428                         uint32_t nstart, nend, gap;
429
430                         idx++;
431                         nstart = r[idx].zr_start;
432                         nend = r[idx].zr_end;
433
434                         gap = nstart - end;
435                         if (gap < new_allowed_gap) {
436                                 end = nend;
437                                 continue;
438                         }
439                         if (gap < mingap)
440                                 mingap = gap;
441                         break;
442                 }
443                 r[output].zr_start = start;
444                 r[output].zr_end = end;
445                 output++;
446         }
447         ASSERT3U(output, <, eip->zei_range_count);
448         eip->zei_range_count = output;
449         eip->zei_mingap = mingap;
450         eip->zei_allowed_mingap = new_allowed_gap;
451 }
452
453 static void
454 zei_add_range(zfs_ecksum_info_t *eip, int start, int end)
455 {
456         struct zei_ranges *r = eip->zei_ranges;
457         size_t count = eip->zei_range_count;
458
459         if (count >= MAX_RANGES) {
460                 zei_shrink_ranges(eip);
461                 count = eip->zei_range_count;
462         }
463         if (count == 0) {
464                 eip->zei_mingap = UINT32_MAX;
465                 eip->zei_allowed_mingap = 1;
466         } else {
467                 int gap = start - r[count - 1].zr_end;
468
469                 if (gap < eip->zei_allowed_mingap) {
470                         r[count - 1].zr_end = end;
471                         return;
472                 }
473                 if (gap < eip->zei_mingap)
474                         eip->zei_mingap = gap;
475         }
476         r[count].zr_start = start;
477         r[count].zr_end = end;
478         eip->zei_range_count++;
479 }
480
481 static size_t
482 zei_range_total_size(zfs_ecksum_info_t *eip)
483 {
484         struct zei_ranges *r = eip->zei_ranges;
485         size_t count = eip->zei_range_count;
486         size_t result = 0;
487         size_t idx;
488
489         for (idx = 0; idx < count; idx++)
490                 result += (r[idx].zr_end - r[idx].zr_start);
491
492         return (result);
493 }
494
495 static zfs_ecksum_info_t *
496 annotate_ecksum(nvlist_t *ereport, zio_bad_cksum_t *info,
497     const uint8_t *goodbuf, const uint8_t *badbuf, size_t size,
498     boolean_t drop_if_identical)
499 {
500         const uint64_t *good = (const uint64_t *)goodbuf;
501         const uint64_t *bad = (const uint64_t *)badbuf;
502
503         uint64_t allset = 0;
504         uint64_t allcleared = 0;
505
506         size_t nui64s = size / sizeof (uint64_t);
507
508         size_t inline_size;
509         int no_inline = 0;
510         size_t idx;
511         size_t range;
512
513         size_t offset = 0;
514         ssize_t start = -1;
515
516         zfs_ecksum_info_t *eip = kmem_zalloc(sizeof (*eip), KM_SLEEP);
517
518         /* don't do any annotation for injected checksum errors */
519         if (info != NULL && info->zbc_injected)
520                 return (eip);
521
522         if (info != NULL && info->zbc_has_cksum) {
523                 fm_payload_set(ereport,
524                     FM_EREPORT_PAYLOAD_ZFS_CKSUM_EXPECTED,
525                     DATA_TYPE_UINT64_ARRAY,
526                     sizeof (info->zbc_expected) / sizeof (uint64_t),
527                     (uint64_t *)&info->zbc_expected,
528                     FM_EREPORT_PAYLOAD_ZFS_CKSUM_ACTUAL,
529                     DATA_TYPE_UINT64_ARRAY,
530                     sizeof (info->zbc_actual) / sizeof (uint64_t),
531                     (uint64_t *)&info->zbc_actual,
532                     FM_EREPORT_PAYLOAD_ZFS_CKSUM_ALGO,
533                     DATA_TYPE_STRING,
534                     info->zbc_checksum_name,
535                     NULL);
536
537                 if (info->zbc_byteswapped) {
538                         fm_payload_set(ereport,
539                             FM_EREPORT_PAYLOAD_ZFS_CKSUM_BYTESWAP,
540                             DATA_TYPE_BOOLEAN, 1,
541                             NULL);
542                 }
543         }
544
545         if (badbuf == NULL || goodbuf == NULL)
546                 return (eip);
547
548         ASSERT3U(nui64s, <=, UINT16_MAX);
549         ASSERT3U(size, ==, nui64s * sizeof (uint64_t));
550         ASSERT3U(size, <=, SPA_MAXBLOCKSIZE);
551         ASSERT3U(size, <=, UINT32_MAX);
552
553         /* build up the range list by comparing the two buffers. */
554         for (idx = 0; idx < nui64s; idx++) {
555                 if (good[idx] == bad[idx]) {
556                         if (start == -1)
557                                 continue;
558
559                         zei_add_range(eip, start, idx);
560                         start = -1;
561                 } else {
562                         if (start != -1)
563                                 continue;
564
565                         start = idx;
566                 }
567         }
568         if (start != -1)
569                 zei_add_range(eip, start, idx);
570
571         /* See if it will fit in our inline buffers */
572         inline_size = zei_range_total_size(eip);
573         if (inline_size > ZFM_MAX_INLINE)
574                 no_inline = 1;
575
576         /*
577          * If there is no change and we want to drop if the buffers are
578          * identical, do so.
579          */
580         if (inline_size == 0 && drop_if_identical) {
581                 kmem_free(eip, sizeof (*eip));
582                 return (NULL);
583         }
584
585         /*
586          * Now walk through the ranges, filling in the details of the
587          * differences.  Also convert our uint64_t-array offsets to byte
588          * offsets.
589          */
590         for (range = 0; range < eip->zei_range_count; range++) {
591                 size_t start = eip->zei_ranges[range].zr_start;
592                 size_t end = eip->zei_ranges[range].zr_end;
593
594                 for (idx = start; idx < end; idx++) {
595                         uint64_t set, cleared;
596
597                         // bits set in bad, but not in good
598                         set = ((~good[idx]) & bad[idx]);
599                         // bits set in good, but not in bad
600                         cleared = (good[idx] & (~bad[idx]));
601
602                         allset |= set;
603                         allcleared |= cleared;
604
605                         if (!no_inline) {
606                                 ASSERT3U(offset, <, inline_size);
607                                 eip->zei_bits_set[offset] = set;
608                                 eip->zei_bits_cleared[offset] = cleared;
609                                 offset++;
610                         }
611
612                         update_histogram(set, eip->zei_histogram_set,
613                             &eip->zei_range_sets[range]);
614                         update_histogram(cleared, eip->zei_histogram_cleared,
615                             &eip->zei_range_clears[range]);
616                 }
617
618                 /* convert to byte offsets */
619                 eip->zei_ranges[range].zr_start *= sizeof (uint64_t);
620                 eip->zei_ranges[range].zr_end   *= sizeof (uint64_t);
621         }
622         eip->zei_allowed_mingap *= sizeof (uint64_t);
623         inline_size             *= sizeof (uint64_t);
624
625         /* fill in ereport */
626         fm_payload_set(ereport,
627             FM_EREPORT_PAYLOAD_ZFS_BAD_OFFSET_RANGES,
628             DATA_TYPE_UINT32_ARRAY, 2 * eip->zei_range_count,
629             (uint32_t *)eip->zei_ranges,
630             FM_EREPORT_PAYLOAD_ZFS_BAD_RANGE_MIN_GAP,
631             DATA_TYPE_UINT32, eip->zei_allowed_mingap,
632             FM_EREPORT_PAYLOAD_ZFS_BAD_RANGE_SETS,
633             DATA_TYPE_UINT32_ARRAY, eip->zei_range_count, eip->zei_range_sets,
634             FM_EREPORT_PAYLOAD_ZFS_BAD_RANGE_CLEARS,
635             DATA_TYPE_UINT32_ARRAY, eip->zei_range_count, eip->zei_range_clears,
636             NULL);
637
638         if (!no_inline) {
639                 fm_payload_set(ereport,
640                     FM_EREPORT_PAYLOAD_ZFS_BAD_SET_BITS,
641                     DATA_TYPE_UINT8_ARRAY,
642                     inline_size, (uint8_t *)eip->zei_bits_set,
643                     FM_EREPORT_PAYLOAD_ZFS_BAD_CLEARED_BITS,
644                     DATA_TYPE_UINT8_ARRAY,
645                     inline_size, (uint8_t *)eip->zei_bits_cleared,
646                     NULL);
647         } else {
648                 fm_payload_set(ereport,
649                     FM_EREPORT_PAYLOAD_ZFS_BAD_SET_HISTOGRAM,
650                     DATA_TYPE_UINT16_ARRAY,
651                     NBBY * sizeof (uint64_t), eip->zei_histogram_set,
652                     FM_EREPORT_PAYLOAD_ZFS_BAD_CLEARED_HISTOGRAM,
653                     DATA_TYPE_UINT16_ARRAY,
654                     NBBY * sizeof (uint64_t), eip->zei_histogram_cleared,
655                     NULL);
656         }
657         return (eip);
658 }
659 #endif
660
661 void
662 zfs_ereport_post(const char *subclass, spa_t *spa, vdev_t *vd, zio_t *zio,
663     uint64_t stateoroffset, uint64_t size)
664 {
665 #ifdef _KERNEL
666         nvlist_t *ereport = NULL;
667         nvlist_t *detector = NULL;
668
669         zfs_ereport_start(&ereport, &detector,
670             subclass, spa, vd, zio, stateoroffset, size);
671
672         if (ereport == NULL)
673                 return;
674
675         /* Cleanup is handled by the callback function */
676         zfs_zevent_post(ereport, detector, zfs_zevent_post_cb);
677 #endif
678 }
679
680 void
681 zfs_ereport_start_checksum(spa_t *spa, vdev_t *vd,
682     struct zio *zio, uint64_t offset, uint64_t length, void *arg,
683     zio_bad_cksum_t *info)
684 {
685         zio_cksum_report_t *report = kmem_zalloc(sizeof (*report), KM_SLEEP);
686
687         if (zio->io_vsd != NULL)
688                 zio->io_vsd_ops->vsd_cksum_report(zio, report, arg);
689         else
690                 zio_vsd_default_cksum_report(zio, report, arg);
691
692         /* copy the checksum failure information if it was provided */
693         if (info != NULL) {
694                 report->zcr_ckinfo = kmem_zalloc(sizeof (*info), KM_SLEEP);
695                 bcopy(info, report->zcr_ckinfo, sizeof (*info));
696         }
697
698         report->zcr_align = 1ULL << vd->vdev_top->vdev_ashift;
699         report->zcr_length = length;
700
701 #ifdef _KERNEL
702         zfs_ereport_start(&report->zcr_ereport, &report->zcr_detector,
703             FM_EREPORT_ZFS_CHECKSUM, spa, vd, zio, offset, length);
704
705         if (report->zcr_ereport == NULL) {
706                 report->zcr_free(report->zcr_cbdata, report->zcr_cbinfo);
707                 kmem_free(report, sizeof (*report));
708                 return;
709         }
710 #endif
711
712         mutex_enter(&spa->spa_errlist_lock);
713         report->zcr_next = zio->io_logical->io_cksum_report;
714         zio->io_logical->io_cksum_report = report;
715         mutex_exit(&spa->spa_errlist_lock);
716 }
717
718 void
719 zfs_ereport_finish_checksum(zio_cksum_report_t *report,
720     const void *good_data, const void *bad_data, boolean_t drop_if_identical)
721 {
722 #ifdef _KERNEL
723         zfs_ecksum_info_t *info = NULL;
724         info = annotate_ecksum(report->zcr_ereport, report->zcr_ckinfo,
725             good_data, bad_data, report->zcr_length, drop_if_identical);
726
727         if (info != NULL)
728                 zfs_zevent_post(report->zcr_ereport,
729                     report->zcr_detector, zfs_zevent_post_cb);
730
731         report->zcr_ereport = report->zcr_detector = NULL;
732         if (info != NULL)
733                 kmem_free(info, sizeof (*info));
734 #endif
735 }
736
737 void
738 zfs_ereport_free_checksum(zio_cksum_report_t *rpt)
739 {
740 #ifdef _KERNEL
741         if (rpt->zcr_ereport != NULL) {
742                 fm_nvlist_destroy(rpt->zcr_ereport,
743                     FM_NVA_FREE);
744                 fm_nvlist_destroy(rpt->zcr_detector,
745                     FM_NVA_FREE);
746         }
747 #endif
748         rpt->zcr_free(rpt->zcr_cbdata, rpt->zcr_cbinfo);
749
750         if (rpt->zcr_ckinfo != NULL)
751                 kmem_free(rpt->zcr_ckinfo, sizeof (*rpt->zcr_ckinfo));
752
753         kmem_free(rpt, sizeof (*rpt));
754 }
755
756 void
757 zfs_ereport_send_interim_checksum(zio_cksum_report_t *report)
758 {
759 #ifdef _KERNEL
760         zfs_zevent_post(report->zcr_ereport, report->zcr_detector, NULL);
761 #endif
762 }
763
764 void
765 zfs_ereport_post_checksum(spa_t *spa, vdev_t *vd,
766     struct zio *zio, uint64_t offset, uint64_t length,
767     const void *good_data, const void *bad_data, zio_bad_cksum_t *zbc)
768 {
769 #ifdef _KERNEL
770         nvlist_t *ereport = NULL;
771         nvlist_t *detector = NULL;
772         zfs_ecksum_info_t *info;
773
774         zfs_ereport_start(&ereport, &detector,
775             FM_EREPORT_ZFS_CHECKSUM, spa, vd, zio, offset, length);
776
777         if (ereport == NULL)
778                 return;
779
780         info = annotate_ecksum(ereport, zbc, good_data, bad_data, length,
781             B_FALSE);
782
783         if (info != NULL) {
784                 zfs_zevent_post(ereport, detector, zfs_zevent_post_cb);
785                 kmem_free(info, sizeof (*info));
786         }
787 #endif
788 }
789
790 static void
791 zfs_post_common(spa_t *spa, vdev_t *vd, const char *name)
792 {
793 #ifdef _KERNEL
794         nvlist_t *resource;
795         char class[64];
796
797         if (spa_load_state(spa) == SPA_LOAD_TRYIMPORT)
798                 return;
799
800         if ((resource = fm_nvlist_create(NULL)) == NULL)
801                 return;
802
803         (void) snprintf(class, sizeof (class), "%s.%s.%s", FM_RSRC_RESOURCE,
804             ZFS_ERROR_CLASS, name);
805         VERIFY(nvlist_add_uint8(resource, FM_VERSION, FM_RSRC_VERSION) == 0);
806         VERIFY(nvlist_add_string(resource, FM_CLASS, class) == 0);
807         VERIFY(nvlist_add_uint64(resource,
808             FM_EREPORT_PAYLOAD_ZFS_POOL_GUID, spa_guid(spa)) == 0);
809         if (vd) {
810                 VERIFY(nvlist_add_uint64(resource,
811                     FM_EREPORT_PAYLOAD_ZFS_VDEV_GUID, vd->vdev_guid) == 0);
812                 VERIFY(nvlist_add_uint64(resource,
813                     FM_EREPORT_PAYLOAD_ZFS_VDEV_STATE, vd->vdev_state) == 0);
814         }
815
816         zfs_zevent_post(resource, NULL, zfs_zevent_post_cb);
817 #endif
818 }
819
820 /*
821  * The 'resource.fs.zfs.removed' event is an internal signal that the given vdev
822  * has been removed from the system.  This will cause the DE to ignore any
823  * recent I/O errors, inferring that they are due to the asynchronous device
824  * removal.
825  */
826 void
827 zfs_post_remove(spa_t *spa, vdev_t *vd)
828 {
829         zfs_post_common(spa, vd, FM_EREPORT_RESOURCE_REMOVED);
830 }
831
832 /*
833  * The 'resource.fs.zfs.autoreplace' event is an internal signal that the pool
834  * has the 'autoreplace' property set, and therefore any broken vdevs will be
835  * handled by higher level logic, and no vdev fault should be generated.
836  */
837 void
838 zfs_post_autoreplace(spa_t *spa, vdev_t *vd)
839 {
840         zfs_post_common(spa, vd, FM_EREPORT_RESOURCE_AUTOREPLACE);
841 }
842
843 /*
844  * The 'resource.fs.zfs.statechange' event is an internal signal that the
845  * given vdev has transitioned its state to DEGRADED or HEALTHY.  This will
846  * cause the retire agent to repair any outstanding fault management cases
847  * open because the device was not found (fault.fs.zfs.device).
848  */
849 void
850 zfs_post_state_change(spa_t *spa, vdev_t *vd)
851 {
852         zfs_post_common(spa, vd, FM_EREPORT_RESOURCE_STATECHANGE);
853 }
854
855 #if defined(_KERNEL) && defined(HAVE_SPL)
856 EXPORT_SYMBOL(zfs_ereport_post);
857 EXPORT_SYMBOL(zfs_ereport_post_checksum);
858 EXPORT_SYMBOL(zfs_post_remove);
859 EXPORT_SYMBOL(zfs_post_autoreplace);
860 EXPORT_SYMBOL(zfs_post_state_change);
861 #endif /* _KERNEL */