svn commit: r208370 - in head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs: . sys

Martin Matuska mm at FreeBSD.org
Fri May 21 08:50:35 UTC 2010


Author: mm
Date: Fri May 21 08:50:34 2010
New Revision: 208370
URL: http://svn.freebsd.org/changeset/base/208370

Log:
  Fix: vdev_reopen() can lead to failed allocations
  
  OpenSolaris onnv-revision: 7980:589f37f25048
  
  Approved by:	pjd, delphij (mentor)
  Obtained from:	OpenSolaris (Bug ID 6764914)
  MFC after:	3 days

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev.h
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c	Fri May 21 05:34:19 2010	(r208369)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/metaslab.c	Fri May 21 08:50:34 2010	(r208370)
@@ -781,7 +781,7 @@ top:
 		/*
 		 * Don't allocate from faulted devices.
 		 */
-		if (!vdev_writeable(vd))
+		if (!vdev_allocatable(vd))
 			goto next;
 		/*
 		 * Avoid writing single-copy data to a failing vdev

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev.h
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev.h	Fri May 21 05:34:19 2010	(r208369)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/vdev.h	Fri May 21 08:50:34 2010	(r208370)
@@ -85,6 +85,7 @@ extern void vdev_clear(spa_t *spa, vdev_
 extern boolean_t vdev_is_dead(vdev_t *vd);
 extern boolean_t vdev_readable(vdev_t *vd);
 extern boolean_t vdev_writeable(vdev_t *vd);
+extern boolean_t vdev_allocatable(vdev_t *vd);
 extern boolean_t vdev_accessible(vdev_t *vd, zio_t *zio);
 
 extern void vdev_cache_init(vdev_t *vd);

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c	Fri May 21 05:34:19 2010	(r208369)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev.c	Fri May 21 08:50:34 2010	(r208370)
@@ -1861,6 +1861,19 @@ vdev_writeable(vdev_t *vd)
 }
 
 boolean_t
+vdev_allocatable(vdev_t *vd)
+{
+	/*
+	 * We currently allow allocations from vdevs which maybe in the
+	 * process of reopening (i.e. VDEV_STATE_CLOSED). If the device
+	 * fails to reopen then we'll catch it later when we're holding
+	 * the proper locks.
+	 */
+	return (!(vdev_is_dead(vd) && vd->vdev_state != VDEV_STATE_CLOSED) &&
+	    !vd->vdev_cant_write);
+}
+
+boolean_t
 vdev_accessible(vdev_t *vd, zio_t *zio)
 {
 	ASSERT(zio->io_vd == vd);


More information about the svn-src-all mailing list