]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
MFV r287623: 5997 FRU field not set during pool creation and never
authordelphij <delphij@FreeBSD.org>
Sun, 13 Sep 2015 07:15:14 +0000 (07:15 +0000)
committerdelphij <delphij@FreeBSD.org>
Sun, 13 Sep 2015 07:15:14 +0000 (07:15 +0000)
updated

ZFS already supports storing the vdev FRU in a vdev property.  There
is code in libzfs to work with this property, and there is code in
the zfs-retire FMA module that looks for that information.  But there
is no code actually setting or updating the FRU.

To address this, ZFS is changed to send a handful of new events
whenever a vdev is added, attached, cleared, or onlined, as well
as when a pool is created or imported.

Note that syseventd is not currently available on FreeBSD and thus
some work is needed to actually support the new ZFS events (e.g. in
zfsd) to actually use this capability, this changeset is mostly a
diff reduction from upstream.

illumos/illumos-gate@1437283407f89cab03860accf49408f94559bc34

Illumos issues:

    5997 FRU field not set during pool creation and never updated
    https://www.illumos.org/issues/5997

sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa.c
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
sys/cddl/contrib/opensolaris/uts/common/sys/sysevent/eventdefs.h

index 47e2f203f4ccf17c035d02a2babd906342982ea2..61c83c1c927b26b230ec8450f8f41f8ab5834c14 100644 (file)
@@ -22,7 +22,7 @@
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2011, 2014 by Delphix. All rights reserved.
- * Copyright (c) 2013, 2014, Nexenta Systems, Inc.  All rights reserved.
+ * Copyright (c) 2015, Nexenta Systems, Inc.  All rights reserved.
  * Copyright (c) 2013 Martin Matuska <mm@FreeBSD.org>. All rights reserved.
  * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
  */
@@ -3774,6 +3774,7 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props,
        txg_wait_synced(spa->spa_dsl_pool, txg);
 
        spa_config_sync(spa, B_FALSE, B_TRUE);
+       spa_event_notify(spa, NULL, ESC_ZFS_POOL_CREATE);
 
        spa_history_log_version(spa, "create");
 
@@ -4234,6 +4235,7 @@ spa_import(const char *pool, nvlist_t *config, nvlist_t *props, uint64_t flags)
                        spa_configfile_set(spa, props, B_FALSE);
 
                spa_config_sync(spa, B_FALSE, B_TRUE);
+               spa_event_notify(spa, NULL, ESC_ZFS_POOL_IMPORT);
 
                mutex_exit(&spa_namespace_lock);
                return (0);
@@ -4364,9 +4366,12 @@ spa_import(const char *pool, nvlist_t *config, nvlist_t *props, uint64_t flags)
         */
        spa_async_request(spa, SPA_ASYNC_AUTOEXPAND);
 
-       mutex_exit(&spa_namespace_lock);
        spa_history_log_version(spa, "import");
 
+       spa_event_notify(spa, NULL, ESC_ZFS_POOL_IMPORT);
+
+       mutex_exit(&spa_namespace_lock);
+
 #ifdef __FreeBSD__
 #ifdef _KERNEL
        zvol_create_minors(pool);
@@ -4712,6 +4717,7 @@ spa_vdev_add(spa_t *spa, nvlist_t *nvroot)
 
        mutex_enter(&spa_namespace_lock);
        spa_config_update(spa, SPA_CONFIG_UPDATE_POOL);
+       spa_event_notify(spa, NULL, ESC_ZFS_VDEV_ADD);
        mutex_exit(&spa_namespace_lock);
 
        return (0);
@@ -4906,6 +4912,11 @@ spa_vdev_attach(spa_t *spa, uint64_t guid, nvlist_t *nvroot, int replacing)
         */
        dsl_resilver_restart(spa->spa_dsl_pool, dtl_max_txg);
 
+       if (spa->spa_bootfs)
+               spa_event_notify(spa, newvd, ESC_ZFS_BOOTFS_VDEV_ATTACH);
+
+       spa_event_notify(spa, newvd, ESC_ZFS_VDEV_ATTACH);
+
        /*
         * Commit the config
         */
@@ -4920,9 +4931,6 @@ spa_vdev_attach(spa_t *spa, uint64_t guid, nvlist_t *nvroot, int replacing)
        spa_strfree(oldvdpath);
        spa_strfree(newvdpath);
 
-       if (spa->spa_bootfs)
-               spa_event_notify(spa, newvd, ESC_ZFS_BOOTFS_VDEV_ATTACH);
-
        return (0);
 }
 
index 663b395d709fb1d65f621fd2efac7b29bf964f9b..a8f1c5f5ca7fce0615ab0a518ded8c463206625d 100644 (file)
@@ -2503,6 +2503,7 @@ int
 vdev_online(spa_t *spa, uint64_t guid, uint64_t flags, vdev_state_t *newstate)
 {
        vdev_t *vd, *tvd, *pvd, *rvd = spa->spa_root_vdev;
+       boolean_t postevent = B_FALSE;
 
        spa_vdev_state_enter(spa, SCL_NONE);
 
@@ -2512,6 +2513,10 @@ vdev_online(spa_t *spa, uint64_t guid, uint64_t flags, vdev_state_t *newstate)
        if (!vd->vdev_ops->vdev_op_leaf)
                return (spa_vdev_state_exit(spa, NULL, ENOTSUP));
 
+       postevent =
+           (vd->vdev_offline == B_TRUE || vd->vdev_tmpoffline == B_TRUE) ?
+           B_TRUE : B_FALSE;
+
        tvd = vd->vdev_top;
        vd->vdev_offline = B_FALSE;
        vd->vdev_tmpoffline = B_FALSE;
@@ -2547,6 +2552,10 @@ vdev_online(spa_t *spa, uint64_t guid, uint64_t flags, vdev_state_t *newstate)
                        return (spa_vdev_state_exit(spa, vd, ENOTSUP));
                spa_async_request(spa, SPA_ASYNC_CONFIG_UPDATE);
        }
+
+       if (postevent)
+               spa_event_notify(spa, vd, ESC_ZFS_VDEV_ONLINE);
+
        return (spa_vdev_state_exit(spa, vd, 0));
 }
 
index 89bb06e50a08faaa09196b8581dbad87341d3666..5760a8564ab94c81b12a36108b0bbe0068d343de 100644 (file)
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #ifndef        _SYS_SYSEVENT_EVENTDEFS_H
@@ -249,9 +249,14 @@ extern "C" {
 #define        ESC_ZFS_RESILVER_START          "ESC_ZFS_resilver_start"
 #define        ESC_ZFS_RESILVER_FINISH         "ESC_ZFS_resilver_finish"
 #define        ESC_ZFS_VDEV_REMOVE             "ESC_ZFS_vdev_remove"
+#define        ESC_ZFS_POOL_CREATE             "ESC_ZFS_pool_create"
 #define        ESC_ZFS_POOL_DESTROY            "ESC_ZFS_pool_destroy"
+#define        ESC_ZFS_POOL_IMPORT             "ESC_ZFS_pool_import"
+#define        ESC_ZFS_VDEV_ADD                "ESC_ZFS_vdev_add"
+#define        ESC_ZFS_VDEV_ATTACH             "ESC_ZFS_vdev_attach"
 #define        ESC_ZFS_VDEV_CLEAR              "ESC_ZFS_vdev_clear"
 #define        ESC_ZFS_VDEV_CHECK              "ESC_ZFS_vdev_check"
+#define        ESC_ZFS_VDEV_ONLINE             "ESC_ZFS_vdev_online"
 #define        ESC_ZFS_CONFIG_SYNC             "ESC_ZFS_config_sync"
 #define        ESC_ZFS_SCRUB_START             "ESC_ZFS_scrub_start"
 #define        ESC_ZFS_SCRUB_FINISH            "ESC_ZFS_scrub_finish"