MFV r304158:
7136 ESC_VDEV_REMOVE_AUX ought to always include vdev information 7115 6922 generates ESC_ZFS_VDEV_REMOVE_AUX a bit too often illumos/illumos-gate@b72b6bb10a https://github.com/illumos/illumos-gate/commit/b72b6bb10ad55121a1b352c6f68ebdc8e 20c9086 https://www.illumos.org/issues/7136 6922 added ESC_ZFS_VDEV_REMOVE_AUX and ESC_ZFS_VDEV_REMOVE_DEV sysevents whenever an aux device gets removed from a pool. However, those sysevents will be created without the vdev_guid and vdev_path fields. It would be better to always populate those fields. https://www.illumos.org/issues/7115 The addition of spa_event_notify in vdev removal code (see #6922) causes event s to be generated even if the spare failed to be removed with EBUSY. Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net> Approved by: Robert Mustacchi <rm@joyent.com> Author: Alan Somers <asomers@gmail.com>
This commit is contained in:
commit
c543b519be
@ -151,6 +151,8 @@ const zio_taskq_info_t zio_taskqs[ZIO_TYPES][ZIO_TASKQ_TYPES] = {
|
||||
{ ZTI_ONE, ZTI_NULL, ZTI_ONE, ZTI_NULL }, /* IOCTL */
|
||||
};
|
||||
|
||||
static sysevent_t *spa_event_create(spa_t *spa, vdev_t *vd, const char *name);
|
||||
static void spa_event_post(sysevent_t *ev);
|
||||
static void spa_sync_version(void *arg, dmu_tx_t *tx);
|
||||
static void spa_sync_props(void *arg, dmu_tx_t *tx);
|
||||
static boolean_t spa_has_active_shared_spare(spa_t *spa);
|
||||
@ -5738,6 +5740,7 @@ int
|
||||
spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare)
|
||||
{
|
||||
vdev_t *vd;
|
||||
sysevent_t *ev = NULL;
|
||||
metaslab_group_t *mg;
|
||||
nvlist_t **spares, **l2cache, *nv;
|
||||
uint64_t txg = 0;
|
||||
@ -5761,6 +5764,9 @@ spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare)
|
||||
* in this pool.
|
||||
*/
|
||||
if (vd == NULL || unspare) {
|
||||
if (vd == NULL)
|
||||
vd = spa_lookup_by_guid(spa, guid, B_TRUE);
|
||||
ev = spa_event_create(spa, vd, ESC_ZFS_VDEV_REMOVE_AUX);
|
||||
spa_vdev_remove_aux(spa->spa_spares.sav_config,
|
||||
ZPOOL_CONFIG_SPARES, spares, nspares, nv);
|
||||
spa_load_spares(spa);
|
||||
@ -5768,7 +5774,6 @@ spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare)
|
||||
} else {
|
||||
error = SET_ERROR(EBUSY);
|
||||
}
|
||||
spa_event_notify(spa, vd, ESC_ZFS_VDEV_REMOVE_AUX);
|
||||
} else if (spa->spa_l2cache.sav_vdevs != NULL &&
|
||||
nvlist_lookup_nvlist_array(spa->spa_l2cache.sav_config,
|
||||
ZPOOL_CONFIG_L2CACHE, &l2cache, &nl2cache) == 0 &&
|
||||
@ -5776,11 +5781,12 @@ spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare)
|
||||
/*
|
||||
* Cache devices can always be removed.
|
||||
*/
|
||||
vd = spa_lookup_by_guid(spa, guid, B_TRUE);
|
||||
ev = spa_event_create(spa, vd, ESC_ZFS_VDEV_REMOVE_AUX);
|
||||
spa_vdev_remove_aux(spa->spa_l2cache.sav_config,
|
||||
ZPOOL_CONFIG_L2CACHE, l2cache, nl2cache, nv);
|
||||
spa_load_l2cache(spa);
|
||||
spa->spa_l2cache.sav_sync = B_TRUE;
|
||||
spa_event_notify(spa, vd, ESC_ZFS_VDEV_REMOVE_AUX);
|
||||
} else if (vd != NULL && vd->vdev_islog) {
|
||||
ASSERT(!locked);
|
||||
ASSERT(vd == vd->vdev_top);
|
||||
@ -5817,9 +5823,9 @@ spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare)
|
||||
/*
|
||||
* Clean up the vdev namespace.
|
||||
*/
|
||||
ev = spa_event_create(spa, vd, ESC_ZFS_VDEV_REMOVE_DEV);
|
||||
spa_vdev_remove_from_namespace(spa, vd);
|
||||
|
||||
spa_event_notify(spa, vd, ESC_ZFS_VDEV_REMOVE_DEV);
|
||||
} else if (vd != NULL) {
|
||||
/*
|
||||
* Normal vdevs cannot be removed (yet).
|
||||
@ -5835,6 +5841,9 @@ spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare)
|
||||
if (!locked)
|
||||
error = spa_vdev_exit(spa, NULL, txg, error);
|
||||
|
||||
if (ev)
|
||||
spa_event_post(ev);
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
||||
@ -7229,24 +7238,17 @@ spa_has_active_shared_spare(spa_t *spa)
|
||||
return (B_FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Post a sysevent corresponding to the given event. The 'name' must be one of
|
||||
* the event definitions in sys/sysevent/eventdefs.h. The payload will be
|
||||
* filled in from the spa and (optionally) the vdev. This doesn't do anything
|
||||
* in the userland libzpool, as we don't want consumers to misinterpret ztest
|
||||
* or zdb as real changes.
|
||||
*/
|
||||
void
|
||||
spa_event_notify(spa_t *spa, vdev_t *vd, const char *name)
|
||||
static sysevent_t *
|
||||
spa_event_create(spa_t *spa, vdev_t *vd, const char *name)
|
||||
{
|
||||
sysevent_t *ev = NULL;
|
||||
#ifdef _KERNEL
|
||||
sysevent_t *ev;
|
||||
sysevent_attr_list_t *attr = NULL;
|
||||
sysevent_value_t value;
|
||||
sysevent_id_t eid;
|
||||
|
||||
ev = sysevent_alloc(EC_ZFS, (char *)name, SUNW_KERN_PUB "zfs",
|
||||
SE_SLEEP);
|
||||
ASSERT(ev != NULL);
|
||||
|
||||
value.value_type = SE_DATA_TYPE_STRING;
|
||||
value.value.sv_string = spa_name(spa);
|
||||
@ -7278,11 +7280,34 @@ spa_event_notify(spa_t *spa, vdev_t *vd, const char *name)
|
||||
goto done;
|
||||
attr = NULL;
|
||||
|
||||
(void) log_sysevent(ev, SE_SLEEP, &eid);
|
||||
|
||||
done:
|
||||
if (attr)
|
||||
sysevent_free_attr(attr);
|
||||
|
||||
#endif
|
||||
return (ev);
|
||||
}
|
||||
|
||||
static void
|
||||
spa_event_post(sysevent_t *ev)
|
||||
{
|
||||
#ifdef _KERNEL
|
||||
sysevent_id_t eid;
|
||||
|
||||
(void) log_sysevent(ev, SE_SLEEP, &eid);
|
||||
sysevent_free(ev);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Post a sysevent corresponding to the given event. The 'name' must be one of
|
||||
* the event definitions in sys/sysevent/eventdefs.h. The payload will be
|
||||
* filled in from the spa and (optionally) the vdev. This doesn't do anything
|
||||
* in the userland libzpool, as we don't want consumers to misinterpret ztest
|
||||
* or zdb as real changes.
|
||||
*/
|
||||
void
|
||||
spa_event_notify(spa_t *spa, vdev_t *vd, const char *name)
|
||||
{
|
||||
spa_event_post(spa_event_create(spa, vd, name));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user