Author: mav
Date: Wed Oct 12 05:20:06 2016
New Revision: 307113
URL: https://svnweb.freebsd.org/changeset/base/307113

Log:
  MFC r305224: 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@b72b6bb10ad55121a1b352c6f68ebdc8e20c9086
  
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.wil...@delphix.com>
  Reviewed by: Josef 'Jeff' Sipek <jef...@josefsipek.net>
  Approved by: Robert Mustacchi <r...@joyent.com>
  Author: Alan Somers <asom...@gmail.com>

Modified:
  stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c
==============================================================================
--- stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c      Wed Oct 
12 05:19:08 2016        (r307112)
+++ stable/11/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c      Wed Oct 
12 05:20:06 2016        (r307113)
@@ -151,6 +151,8 @@ const zio_taskq_info_t zio_taskqs[ZIO_TY
        { 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 gui
                 * 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 gui
                } 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 gui
                /*
                 * 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 gui
                /*
                 * 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 gui
        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,
                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));
+}
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to