6882196 resource.* events shouldn't be posted during spa_tryimport()
authorEric Schrock <Eric.Schrock@Sun.COM>
Thu, 17 Sep 2009 15:21:48 -0700
changeset 10575 2a8816c5173b
parent 10574 c8621ef15d56
child 10576 6b4d0968a170
6882196 resource.* events shouldn't be posted during spa_tryimport() 6882199 resource.removed event needs to be posted much earlier 6882204 want objset as a private property 6882206 want unique available as a private property 6882227 spa_async_remove() shouldn't do a full clear
usr/src/cmd/fm/modules/common/zfs-diagnosis/zfs_de.c
usr/src/common/zfs/zfs_prop.c
usr/src/uts/common/fs/zfs/dsl_dataset.c
usr/src/uts/common/fs/zfs/spa.c
usr/src/uts/common/fs/zfs/vdev_disk.c
usr/src/uts/common/fs/zfs/zfs_fm.c
usr/src/uts/common/sys/fs/zfs.h
--- a/usr/src/cmd/fm/modules/common/zfs-diagnosis/zfs_de.c	Thu Sep 17 11:03:46 2009 -0700
+++ b/usr/src/cmd/fm/modules/common/zfs-diagnosis/zfs_de.c	Thu Sep 17 15:21:48 2009 -0700
@@ -19,12 +19,10 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 #include <assert.h>
 #include <stddef.h>
 #include <strings.h>
@@ -710,12 +708,11 @@
 };
 
 static const fmd_prop_t fmd_props[] = {
-	{ "case_timeout", FMD_TYPE_TIME, "5sec" },
 	{ "checksum_N", FMD_TYPE_UINT32, "10" },
 	{ "checksum_T", FMD_TYPE_TIME, "10min" },
 	{ "io_N", FMD_TYPE_UINT32, "10" },
 	{ "io_T", FMD_TYPE_TIME, "10min" },
-	{ "remove_timeout", FMD_TYPE_TIME, "5sec" },
+	{ "remove_timeout", FMD_TYPE_TIME, "15sec" },
 	{ NULL, 0, NULL }
 };
 
--- a/usr/src/common/zfs/zfs_prop.c	Thu Sep 17 11:03:46 2009 -0700
+++ b/usr/src/common/zfs/zfs_prop.c	Thu Sep 17 15:21:48 2009 -0700
@@ -335,6 +335,10 @@
 	    ZFS_TYPE_DATASET, "GUID");
 	register_hidden(ZFS_PROP_USERACCOUNTING, "useraccounting",
 	    PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_DATASET, NULL);
+	register_hidden(ZFS_PROP_UNIQUE, "unique", PROP_TYPE_NUMBER,
+	    PROP_READONLY, ZFS_TYPE_DATASET, NULL);
+	register_hidden(ZFS_PROP_OBJSETID, "objsetid", PROP_TYPE_NUMBER,
+	    PROP_READONLY, ZFS_TYPE_DATASET, "OBJSETID");
 
 	/* oddball properties */
 	register_impl(ZFS_PROP_CREATION, "creation", PROP_TYPE_NUMBER, 0, NULL,
--- a/usr/src/uts/common/fs/zfs/dsl_dataset.c	Thu Sep 17 11:03:46 2009 -0700
+++ b/usr/src/uts/common/fs/zfs/dsl_dataset.c	Thu Sep 17 15:21:48 2009 -0700
@@ -2017,6 +2017,10 @@
 	    ds->ds_reserved);
 	dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_GUID,
 	    ds->ds_phys->ds_guid);
+	dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_UNIQUE,
+	    dsl_dataset_unique(ds));
+	dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_OBJSETID,
+	    ds->ds_object);
 	dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_USERREFS, ds->ds_userrefs);
 	dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_DEFER_DESTROY,
 	    DS_IS_DEFER_DESTROY(ds) ? 1 : 0);
--- a/usr/src/uts/common/fs/zfs/spa.c	Thu Sep 17 11:03:46 2009 -0700
+++ b/usr/src/uts/common/fs/zfs/spa.c	Thu Sep 17 15:21:48 2009 -0700
@@ -3683,7 +3683,17 @@
 	if (vd->vdev_remove_wanted) {
 		vd->vdev_remove_wanted = 0;
 		vdev_set_state(vd, B_FALSE, VDEV_STATE_REMOVED, VDEV_AUX_NONE);
-		vdev_clear(spa, vd);
+
+		/*
+		 * We want to clear the stats, but we don't want to do a full
+		 * vdev_clear() as that will cause us to throw away
+		 * degraded/faulted state as well as attempt to reopen the
+		 * device, all of which is a waste.
+		 */
+		vd->vdev_stat.vs_read_errors = 0;
+		vd->vdev_stat.vs_write_errors = 0;
+		vd->vdev_stat.vs_checksum_errors = 0;
+
 		vdev_state_dirty(vd->vdev_top);
 	}
 
--- a/usr/src/uts/common/fs/zfs/vdev_disk.c	Thu Sep 17 11:03:46 2009 -0700
+++ b/usr/src/uts/common/fs/zfs/vdev_disk.c	Thu Sep 17 15:21:48 2009 -0700
@@ -430,12 +430,19 @@
 	 * asynchronous removal of the device. Otherwise, probe the device and
 	 * make sure it's still accessible.
 	 */
-	if (zio->io_error == EIO) {
+	if (zio->io_error == EIO && !vd->vdev_remove_wanted) {
 		vdev_disk_t *dvd = vd->vdev_tsd;
 		int state = DKIO_NONE;
 
 		if (ldi_ioctl(dvd->vd_lh, DKIOCSTATE, (intptr_t)&state,
 		    FKIOCTL, kcred, NULL) == 0 && state != DKIO_INSERTED) {
+			/*
+			 * We post the resource as soon as possible, instead of
+			 * when the async removal actually happens, because the
+			 * DE is using this information to discard previous I/O
+			 * errors.
+			 */
+			zfs_post_remove(zio->io_spa, vd);
 			vd->vdev_remove_wanted = B_TRUE;
 			spa_async_request(zio->io_spa, SPA_ASYNC_REMOVE);
 		}
--- a/usr/src/uts/common/fs/zfs/zfs_fm.c	Thu Sep 17 11:03:46 2009 -0700
+++ b/usr/src/uts/common/fs/zfs/zfs_fm.c	Thu Sep 17 15:21:48 2009 -0700
@@ -147,9 +147,7 @@
 			 * not yet been asynchronously placed into the REMOVED
 			 * state.
 			 */
-			if (zio->io_vd == vd &&
-			    !vdev_accessible(vd, zio) &&
-			    strcmp(subclass, FM_EREPORT_ZFS_PROBE_FAILURE) != 0)
+			if (zio->io_vd == vd && !vdev_accessible(vd, zio))
 				return;
 
 			/*
@@ -164,6 +162,15 @@
 		}
 	}
 
+	/*
+	 * For probe failure, we want to avoid posting ereports if we've
+	 * already removed the device in the meantime.
+	 */
+	if (vd != NULL &&
+	    strcmp(subclass, FM_EREPORT_ZFS_PROBE_FAILURE) == 0 &&
+	    (vd->vdev_remove_wanted || vd->vdev_state == VDEV_STATE_REMOVED))
+		return;
+
 	if ((ereport = fm_nvlist_create(NULL)) == NULL)
 		return;
 
@@ -338,6 +345,9 @@
 	nvlist_t *resource;
 	char class[64];
 
+	if (spa->spa_load_state == SPA_LOAD_TRYIMPORT)
+		return;
+
 	if ((resource = fm_nvlist_create(NULL)) == NULL)
 		return;
 
--- a/usr/src/uts/common/sys/fs/zfs.h	Thu Sep 17 11:03:46 2009 -0700
+++ b/usr/src/uts/common/sys/fs/zfs.h	Thu Sep 17 15:21:48 2009 -0700
@@ -117,6 +117,8 @@
 	ZFS_PROP_DEFER_DESTROY,
 	ZFS_PROP_USERREFS,
 	ZFS_PROP_LOGBIAS,
+	ZFS_PROP_UNIQUE,		/* not exposed to the user */
+	ZFS_PROP_OBJSETID,		/* not exposed to the user */
 	ZFS_NUM_PROPS
 } zfs_prop_t;