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
--- 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;