]> git.proxmox.com Git - mirror_zfs.git/commitdiff
OpenZFS 7786 - zfs`vdev_online() needs better notification about state changes
authorYuri Pankov <yuri.pankov@nexenta.com>
Wed, 26 Apr 2017 18:55:10 +0000 (14:55 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 1 May 2017 20:24:37 +0000 (16:24 -0400)
Authored by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Approved by: Albert Lee <trisk@forkgnu.org>
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Ported-by: bunder2015 <omfgbunder@gmail.com>
OpenZFS-issue: https://www.illumos.org/issues/7786
OpenZFS-commit: http://github.com/openzfs/openzfs/commit/db8498f
Closes #6074

module/zfs/vdev.c

index caf92899d0c8e964652493a68d5316dd518188c8..da06391029fdf4d9092cb699371ba4e8fa26e0f0 100644 (file)
@@ -22,7 +22,7 @@
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2011, 2015 by Delphix. All rights reserved.
- * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.
  * Copyright (c) 2014 Integros [integros.com]
  * Copyright 2016 Toomas Soome <tsoome@me.com>
  */
@@ -2530,7 +2530,8 @@ 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;
+       boolean_t wasoffline;
+       vdev_state_t oldstate;
 
        spa_vdev_state_enter(spa, SCL_NONE);
 
@@ -2540,9 +2541,8 @@ 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;
+       wasoffline = (vd->vdev_offline || vd->vdev_tmpoffline);
+       oldstate = vd->vdev_state;
 
        tvd = vd->vdev_top;
        vd->vdev_offline = B_FALSE;
@@ -2580,7 +2580,9 @@ vdev_online(spa_t *spa, uint64_t guid, uint64_t flags, vdev_state_t *newstate)
                spa_async_request(spa, SPA_ASYNC_CONFIG_UPDATE);
        }
 
-       if (postevent)
+       if (wasoffline ||
+           (oldstate < VDEV_STATE_DEGRADED &&
+           vd->vdev_state >= VDEV_STATE_DEGRADED))
                spa_event_notify(spa, vd, ESC_ZFS_VDEV_ONLINE);
 
        return (spa_vdev_state_exit(spa, vd, 0));