svn commit: r300357 - projects/zfsd/head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Alan Somers
asomers at FreeBSD.org
Sat May 21 02:29:36 UTC 2016
Author: asomers
Date: Sat May 21 02:29:35 2016
New Revision: 300357
URL: https://svnweb.freebsd.org/changeset/base/300357
Log:
Fix the resource.fs.zfs.statechange message
It had a number of problems:
* It was only being emitted on a transition to the HEALTHY state. That
made it impossible for zfsd to take actions based on drives getting
sicker.
* It compared the new state to vdev_prevstate, which is the state that
the vdev had the last time it was opened. That doesn't make sense,
because a vdev can change state multiple times without being reopened.
* vdev_set_state contains logic that will change the device's new state
based on various conditions. However, the statechange event was being
posted _before_ that logic took effect. Now it's being posted after.
Sponsored by: Spectra Logic Corp
Modified:
projects/zfsd/head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
Modified: projects/zfsd/head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
==============================================================================
--- projects/zfsd/head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c Sat May 21 02:14:11 2016 (r300356)
+++ projects/zfsd/head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c Sat May 21 02:29:35 2016 (r300357)
@@ -3366,19 +3366,6 @@ vdev_set_state(vdev_t *vd, boolean_t iso
vd->vdev_ops->vdev_op_leaf)
vd->vdev_ops->vdev_op_close(vd);
- /*
- * If we have brought this vdev back into service, we need
- * to notify fmd so that it can gracefully repair any outstanding
- * cases due to a missing device. We do this in all cases, even those
- * that probably don't correlate to a repaired fault. This is sure to
- * catch all cases, and we let the zfs-retire agent sort it out. If
- * this is a transient state it's OK, as the retire agent will
- * double-check the state of the vdev before repairing it.
- */
- if (state == VDEV_STATE_HEALTHY && vd->vdev_ops->vdev_op_leaf &&
- vd->vdev_prevstate != state)
- zfs_post_state_change(spa, vd);
-
if (vd->vdev_removed &&
state == VDEV_STATE_CANT_OPEN &&
(aux == VDEV_AUX_OPEN_FAILED || vd->vdev_checkremove)) {
@@ -3459,6 +3446,16 @@ vdev_set_state(vdev_t *vd, boolean_t iso
vd->vdev_removed = B_FALSE;
}
+ /*
+ * Notify the fmd of the state change. Be verbose and post
+ * notifications even for stuff that's not important; the fmd agent can
+ * sort it out. Don't emit state change events for non-leaf vdevs since
+ * they can't change state on their own. The FMD can check their state
+ * if it wants to when it sees that a leaf vdev had a state change.
+ */
+ if (vd->vdev_ops->vdev_op_leaf)
+ zfs_post_state_change(spa, vd);
+
if (!isopen && vd->vdev_parent)
vdev_propagate_state(vd->vdev_parent);
}
More information about the svn-src-projects
mailing list