Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 21 May 2010 08:50:34 +0000 (UTC)
From:      Martin Matuska <mm@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r208370 - in head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs: . sys
Message-ID:  <201005210850.o4L8oYLD064621@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201005210850.o4L8oYLD064621>