Mercurial > illumos > illumos-gate
changeset 10575:2a8816c5173b
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
author | Eric Schrock <Eric.Schrock@Sun.COM> |
---|---|
date | Thu, 17 Sep 2009 15:21:48 -0700 |
parents | c8621ef15d56 |
children | 6b4d0968a170 |
files | 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 |
diffstat | 7 files changed, 44 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- 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;