usr/src/uts/common/fs/zfs/zfs_fm.c
author eschrock
Tue, 05 Sep 2006 11:37:36 -0700
changeset 2676 5cee47eddab6
parent 1955 24fe75aaee9a
child 4451 24fbf2d7a5d7
permissions -rw-r--r--
PSARC 2006/486 ZFS canmount property PSARC 2006/497 ZFS create time properties PSARC 2006/502 ZFS get all datasets PSARC 2006/504 ZFS user properties 6269805 properties should be set via an nvlist. 6281585 user defined properties 6349494 'zfs list' output annoying for even moderately long dataset names 6366244 'canmount' option for container-like functionality 6367103 create-time properties 6416639 RFE: provide zfs get -a 6437808 ZFS module version should match on-disk version 6454551 'zfs create -b blocksize filesystem' should fail. 6457478 unrecognized character in error message with 'zpool create -R' command 6457865 missing device name in the error message of 'zpool clear' command 6458571 zfs_ioc_set_prop() doesn't validate input 6458614 zfs ACL #defines should use prefix 6458638 get_configs() accesses bogus memory 6458678 zvol functions should be moved out of zfs_ioctl.h 6458683 zfs_cmd_t could use more cleanup 6458691 common routines to manage zfs_cmd_t nvlists 6460398 zpool import cores on zfs_prop_get 6461029 zpool status -x noexisting-pool has incorrect error message. 6461223 index translations should live with property definitions 6461424 zpool_unmount_datasets() has some busted logic 6461427 zfs_realloc() would be useful 6461757 'zpool status' can report the wrong number of persistent errors 6461784 recursive zfs_snapshot() leaks memory
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     1
/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     2
 * CDDL HEADER START
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     3
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     7
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    11
 * and limitations under the License.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    12
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    18
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    19
 * CDDL HEADER END
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    20
 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    21
/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    22
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    23
 * Use is subject to license terms.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    24
 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    25
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    27
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    28
#include <sys/spa.h>
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    29
#include <sys/spa_impl.h>
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    30
#include <sys/vdev.h>
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    31
#include <sys/vdev_impl.h>
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    32
#include <sys/zio.h>
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    33
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    34
#include <sys/fm/fs/zfs.h>
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    35
#include <sys/fm/protocol.h>
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    36
#include <sys/fm/util.h>
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    37
#include <sys/sysevent.h>
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    38
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    39
/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    40
 * This general routine is responsible for generating all the different ZFS
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    41
 * ereports.  The payload is dependent on the class, and which arguments are
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    42
 * supplied to the function:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    43
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    44
 * 	EREPORT			POOL	VDEV	IO
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    45
 * 	block			X	X	X
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    46
 * 	data			X		X
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    47
 * 	device			X	X
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    48
 * 	pool			X
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    49
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    50
 * If we are in a loading state, all errors are chained together by the same
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    51
 * SPA-wide ENA.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    52
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    53
 * For isolated I/O requests, we get the ENA from the zio_t. The propagation
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    54
 * gets very complicated due to RAID-Z, gang blocks, and vdev caching.  We want
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    55
 * to chain together all ereports associated with a logical piece of data.  For
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    56
 * read I/Os, there  are basically three 'types' of I/O, which form a roughly
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    57
 * layered diagram:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    58
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    59
 *      +---------------+
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    60
 * 	| Aggregate I/O |	No associated logical data or device
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    61
 * 	+---------------+
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    62
 *              |
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    63
 *              V
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    64
 * 	+---------------+	Reads associated with a piece of logical data.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    65
 * 	|   Read I/O    |	This includes reads on behalf of RAID-Z,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    66
 * 	+---------------+       mirrors, gang blocks, retries, etc.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    67
 *              |
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    68
 *              V
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    69
 * 	+---------------+	Reads associated with a particular device, but
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    70
 * 	| Physical I/O  |	no logical data.  Issued as part of vdev caching
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    71
 * 	+---------------+	and I/O aggregation.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    72
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    73
 * Note that 'physical I/O' here is not the same terminology as used in the rest
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    74
 * of ZIO.  Typically, 'physical I/O' simply means that there is no attached
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    75
 * blockpointer.  But I/O with no associated block pointer can still be related
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    76
 * to a logical piece of data (i.e. RAID-Z requests).
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    77
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    78
 * Purely physical I/O always have unique ENAs.  They are not related to a
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    79
 * particular piece of logical data, and therefore cannot be chained together.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    80
 * We still generate an ereport, but the DE doesn't correlate it with any
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    81
 * logical piece of data.  When such an I/O fails, the delegated I/O requests
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    82
 * will issue a retry, which will trigger the 'real' ereport with the correct
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    83
 * ENA.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    84
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    85
 * We keep track of the ENA for a ZIO chain through the 'io_logical' member.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    86
 * When a new logical I/O is issued, we set this to point to itself.  Child I/Os
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    87
 * then inherit this pointer, so that when it is first set subsequent failures
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    88
 * will use the same ENA.  If a physical I/O is issued (by passing the
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    89
 * ZIO_FLAG_NOBOOKMARK flag), then this pointer is reset, guaranteeing that a
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    90
 * unique ENA will be generated.  For an aggregate I/O, this pointer is set to
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    91
 * NULL, and no ereport will be generated (since it doesn't actually correspond
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    92
 * to any particular device or piece of data).
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    93
 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    94
void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    95
zfs_ereport_post(const char *subclass, spa_t *spa, vdev_t *vd, zio_t *zio,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    96
    uint64_t stateoroffset, uint64_t size)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    97
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    98
#ifdef _KERNEL
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
    99
	nvlist_t *ereport, *detector;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   100
	uint64_t ena;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   101
	char class[64];
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   102
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   103
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   104
	 * If we are doing a spa_tryimport(), ignore errors.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   105
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   106
	if (spa->spa_load_state == SPA_LOAD_TRYIMPORT)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   107
		return;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   108
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   109
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   110
	 * If we are in the middle of opening a pool, and the previous attempt
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   111
	 * failed, don't bother logging any new ereports - we're just going to
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   112
	 * get the same diagnosis anyway.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   113
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   114
	if (spa->spa_load_state != SPA_LOAD_NONE &&
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   115
	    spa->spa_last_open_failed)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   116
		return;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   117
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   118
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   119
	 * Ignore any errors from I/Os that we are going to retry anyway - we
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   120
	 * only generate errors from the final failure.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   121
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   122
	if (zio && zio_should_retry(zio))
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   123
		return;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   124
1773
d6e4f2855c14 6407791 bringover into ZFS results in s. files newer than extracted source
eschrock
parents: 1544
diff changeset
   125
	/*
d6e4f2855c14 6407791 bringover into ZFS results in s. files newer than extracted source
eschrock
parents: 1544
diff changeset
   126
	 * If this is not a read or write zio, ignore the error.  This can occur
d6e4f2855c14 6407791 bringover into ZFS results in s. files newer than extracted source
eschrock
parents: 1544
diff changeset
   127
	 * if the DKIOCFLUSHWRITECACHE ioctl fails.
d6e4f2855c14 6407791 bringover into ZFS results in s. files newer than extracted source
eschrock
parents: 1544
diff changeset
   128
	 */
d6e4f2855c14 6407791 bringover into ZFS results in s. files newer than extracted source
eschrock
parents: 1544
diff changeset
   129
	if (zio && zio->io_type != ZIO_TYPE_READ &&
d6e4f2855c14 6407791 bringover into ZFS results in s. files newer than extracted source
eschrock
parents: 1544
diff changeset
   130
	    zio->io_type != ZIO_TYPE_WRITE)
d6e4f2855c14 6407791 bringover into ZFS results in s. files newer than extracted source
eschrock
parents: 1544
diff changeset
   131
		return;
d6e4f2855c14 6407791 bringover into ZFS results in s. files newer than extracted source
eschrock
parents: 1544
diff changeset
   132
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   133
	if ((ereport = fm_nvlist_create(NULL)) == NULL)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   134
		return;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   135
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   136
	if ((detector = fm_nvlist_create(NULL)) == NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   137
		fm_nvlist_destroy(ereport, FM_NVA_FREE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   138
		return;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   139
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   140
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   141
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   142
	 * Serialize ereport generation
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   143
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   144
	mutex_enter(&spa->spa_errlist_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   145
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   146
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   147
	 * Determine the ENA to use for this event.  If we are in a loading
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   148
	 * state, use a SPA-wide ENA.  Otherwise, if we are in an I/O state, use
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   149
	 * a root zio-wide ENA.  Otherwise, simply use a unique ENA.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   150
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   151
	if (spa->spa_load_state != SPA_LOAD_NONE) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   152
		if (spa->spa_ena == 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   153
			spa->spa_ena = fm_ena_generate(0, FM_ENA_FMT1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   154
		ena = spa->spa_ena;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   155
	} else if (zio != NULL && zio->io_logical != NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   156
		if (zio->io_logical->io_ena == 0)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   157
			zio->io_logical->io_ena =
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   158
			    fm_ena_generate(0, FM_ENA_FMT1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   159
		ena = zio->io_logical->io_ena;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   160
	} else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   161
		ena = fm_ena_generate(0, FM_ENA_FMT1);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   162
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   163
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   164
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   165
	 * Construct the full class, detector, and other standard FMA fields.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   166
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   167
	(void) snprintf(class, sizeof (class), "%s.%s",
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   168
	    ZFS_ERROR_CLASS, subclass);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   169
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   170
	fm_fmri_zfs_set(detector, FM_ZFS_SCHEME_VERSION, spa_guid(spa),
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   171
	    vd != NULL ? vd->vdev_guid : 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   172
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   173
	fm_ereport_set(ereport, FM_EREPORT_VERSION, class, ena, detector, NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   174
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   175
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   176
	 * Construct the per-ereport payload, depending on which parameters are
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   177
	 * passed in.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   178
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   179
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   180
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   181
	 * Generic payload members common to all ereports.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   182
	 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   183
	 * The direct reference to spa_name is used rather than spa_name()
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   184
	 * because of the asynchronous nature of the zio pipeline.  spa_name()
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   185
	 * asserts that the config lock is held in some form.  This is always
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   186
	 * the case in I/O context, but because the check for RW_WRITER compares
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   187
	 * against 'curthread', we may be in an asynchronous context and blow
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   188
	 * this assert.  Rather than loosen this assert, we acknowledge that all
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   189
	 * contexts in which this function is called (pool open, I/O) are safe,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   190
	 * and dereference the name directly.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   191
	 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   192
	fm_payload_set(ereport, FM_EREPORT_PAYLOAD_ZFS_POOL,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   193
	    DATA_TYPE_STRING, spa->spa_name, FM_EREPORT_PAYLOAD_ZFS_POOL_GUID,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   194
	    DATA_TYPE_UINT64, spa_guid(spa),
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   195
	    FM_EREPORT_PAYLOAD_ZFS_POOL_CONTEXT, DATA_TYPE_INT32,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   196
	    spa->spa_load_state, NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   197
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   198
	if (vd != NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   199
		vdev_t *pvd = vd->vdev_parent;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   200
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   201
		fm_payload_set(ereport, FM_EREPORT_PAYLOAD_ZFS_VDEV_GUID,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   202
		    DATA_TYPE_UINT64, vd->vdev_guid,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   203
		    FM_EREPORT_PAYLOAD_ZFS_VDEV_TYPE,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   204
		    DATA_TYPE_STRING, vd->vdev_ops->vdev_op_type, NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   205
		if (vd->vdev_path)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   206
			fm_payload_set(ereport,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   207
			    FM_EREPORT_PAYLOAD_ZFS_VDEV_PATH,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   208
			    DATA_TYPE_STRING, vd->vdev_path, NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   209
		if (vd->vdev_devid)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   210
			fm_payload_set(ereport,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   211
			    FM_EREPORT_PAYLOAD_ZFS_VDEV_DEVID,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   212
			    DATA_TYPE_STRING, vd->vdev_devid, NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   213
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   214
		if (pvd != NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   215
			fm_payload_set(ereport,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   216
			    FM_EREPORT_PAYLOAD_ZFS_PARENT_GUID,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   217
			    DATA_TYPE_UINT64, pvd->vdev_guid,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   218
			    FM_EREPORT_PAYLOAD_ZFS_PARENT_TYPE,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   219
			    DATA_TYPE_STRING, pvd->vdev_ops->vdev_op_type,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   220
			    NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   221
			if (pvd->vdev_path)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   222
				fm_payload_set(ereport,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   223
				    FM_EREPORT_PAYLOAD_ZFS_PARENT_PATH,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   224
				    DATA_TYPE_STRING, vd->vdev_path, NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   225
			if (pvd->vdev_devid)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   226
				fm_payload_set(ereport,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   227
				    FM_EREPORT_PAYLOAD_ZFS_PARENT_DEVID,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   228
				    DATA_TYPE_STRING, pvd->vdev_devid, NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   229
		}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   230
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   231
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   232
	if (zio != NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   233
		/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   234
		 * Payload common to all I/Os.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   235
		 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   236
		fm_payload_set(ereport, FM_EREPORT_PAYLOAD_ZFS_ZIO_ERR,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   237
		    DATA_TYPE_INT32, zio->io_error, NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   238
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   239
		/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   240
		 * If the 'size' parameter is non-zero, it indicates this is a
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   241
		 * RAID-Z or other I/O where the physical offset and length are
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   242
		 * provided for us, instead of within the zio_t.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   243
		 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   244
		if (vd != NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   245
			if (size)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   246
				fm_payload_set(ereport,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   247
				    FM_EREPORT_PAYLOAD_ZFS_ZIO_OFFSET,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   248
				    DATA_TYPE_UINT64, stateoroffset,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   249
				    FM_EREPORT_PAYLOAD_ZFS_ZIO_SIZE,
1955
24fe75aaee9a 6423046 zfs_ereport_post() forgets terminating NULL for fm_payload_set()
eschrock
parents: 1773
diff changeset
   250
				    DATA_TYPE_UINT64, size, NULL);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   251
			else
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   252
				fm_payload_set(ereport,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   253
				    FM_EREPORT_PAYLOAD_ZFS_ZIO_OFFSET,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   254
				    DATA_TYPE_UINT64, zio->io_offset,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   255
				    FM_EREPORT_PAYLOAD_ZFS_ZIO_SIZE,
1955
24fe75aaee9a 6423046 zfs_ereport_post() forgets terminating NULL for fm_payload_set()
eschrock
parents: 1773
diff changeset
   256
				    DATA_TYPE_UINT64, zio->io_size, NULL);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   257
		}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   258
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   259
		/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   260
		 * Payload for I/Os with corresponding logical information.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   261
		 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   262
		if (zio->io_logical != NULL)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   263
			fm_payload_set(ereport,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   264
			    FM_EREPORT_PAYLOAD_ZFS_ZIO_OBJSET,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   265
			    DATA_TYPE_UINT64,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   266
			    zio->io_logical->io_bookmark.zb_objset,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   267
			    FM_EREPORT_PAYLOAD_ZFS_ZIO_OBJECT,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   268
			    DATA_TYPE_UINT64,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   269
			    zio->io_logical->io_bookmark.zb_object,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   270
			    FM_EREPORT_PAYLOAD_ZFS_ZIO_LEVEL,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   271
			    DATA_TYPE_INT32,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   272
			    zio->io_logical->io_bookmark.zb_level,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   273
			    FM_EREPORT_PAYLOAD_ZFS_ZIO_BLKID,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   274
			    DATA_TYPE_UINT64,
1955
24fe75aaee9a 6423046 zfs_ereport_post() forgets terminating NULL for fm_payload_set()
eschrock
parents: 1773
diff changeset
   275
			    zio->io_logical->io_bookmark.zb_blkid, NULL);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   276
	} else if (vd != NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   277
		/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   278
		 * If we have a vdev but no zio, this is a device fault, and the
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   279
		 * 'stateoroffset' parameter indicates the previous state of the
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   280
		 * vdev.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   281
		 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   282
		fm_payload_set(ereport,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   283
		    FM_EREPORT_PAYLOAD_ZFS_PREV_STATE,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   284
		    DATA_TYPE_UINT64, stateoroffset, NULL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   285
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   286
	mutex_exit(&spa->spa_errlist_lock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   287
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   288
	fm_ereport_post(ereport, EVCH_SLEEP);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   289
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   290
	fm_nvlist_destroy(ereport, FM_NVA_FREE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   291
	fm_nvlist_destroy(detector, FM_NVA_FREE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   292
#endif
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   293
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   294
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   295
/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   296
 * The 'resource.fs.zfs.ok' event is an internal signal that the associated
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   297
 * resource (pool or disk) has been identified by ZFS as healthy.  This will
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   298
 * then trigger the DE to close the associated case, if any.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   299
 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   300
void
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   301
zfs_post_ok(spa_t *spa, vdev_t *vd)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   302
{
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   303
#ifdef _KERNEL
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   304
	nvlist_t *resource;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   305
	char class[64];
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   306
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   307
	if ((resource = fm_nvlist_create(NULL)) == NULL)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   308
		return;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   309
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   310
	(void) snprintf(class, sizeof (class), "%s.%s.%s", FM_RSRC_RESOURCE,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   311
	    ZFS_ERROR_CLASS, FM_RESOURCE_OK);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   312
	VERIFY(nvlist_add_uint8(resource, FM_VERSION, FM_RSRC_VERSION) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   313
	VERIFY(nvlist_add_string(resource, FM_CLASS, class) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   314
	VERIFY(nvlist_add_uint64(resource,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   315
	    FM_EREPORT_PAYLOAD_ZFS_POOL_GUID, spa_guid(spa)) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   316
	if (vd)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   317
		VERIFY(nvlist_add_uint64(resource,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   318
		    FM_EREPORT_PAYLOAD_ZFS_VDEV_GUID, vd->vdev_guid) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   319
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   320
	fm_ereport_post(resource, EVCH_SLEEP);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   321
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   322
	fm_nvlist_destroy(resource, FM_NVA_FREE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   323
#endif
938876158511 PSARC 2006/077 zpool clear
eschrock
parents:
diff changeset
   324
}