OpenZFS 7786 - zfs`vdev_online() needs better notification about state changes

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
This commit is contained in:
Yuri Pankov 2017-04-26 14:55:10 -04:00 committed by Brian Behlendorf
parent e99932f7de
commit 153b228554

View File

@ -22,7 +22,7 @@
/* /*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011, 2015 by Delphix. 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 (c) 2014 Integros [integros.com]
* Copyright 2016 Toomas Soome <tsoome@me.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_online(spa_t *spa, uint64_t guid, uint64_t flags, vdev_state_t *newstate)
{ {
vdev_t *vd, *tvd, *pvd, *rvd = spa->spa_root_vdev; 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); 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) if (!vd->vdev_ops->vdev_op_leaf)
return (spa_vdev_state_exit(spa, NULL, ENOTSUP)); return (spa_vdev_state_exit(spa, NULL, ENOTSUP));
postevent = wasoffline = (vd->vdev_offline || vd->vdev_tmpoffline);
(vd->vdev_offline == B_TRUE || vd->vdev_tmpoffline == B_TRUE) ? oldstate = vd->vdev_state;
B_TRUE : B_FALSE;
tvd = vd->vdev_top; tvd = vd->vdev_top;
vd->vdev_offline = B_FALSE; 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); 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); spa_event_notify(spa, vd, ESC_ZFS_VDEV_ONLINE);
return (spa_vdev_state_exit(spa, vd, 0)); return (spa_vdev_state_exit(spa, vd, 0));