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