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