6566482 panic replacing a pool device whilst intent log being used
authorperrin
Wed, 13 Jun 2007 16:23:58 -0700
changeset 4469 7d15cd6c3854
parent 4468 4ff2fc29bcfe
child 4470 e843bda1b001
6566482 panic replacing a pool device whilst intent log being used
usr/src/uts/common/fs/zfs/sys/zio.h
usr/src/uts/common/fs/zfs/zil.c
usr/src/uts/common/fs/zfs/zio.c
--- a/usr/src/uts/common/fs/zfs/sys/zio.h	Wed Jun 13 15:01:11 2007 -0700
+++ b/usr/src/uts/common/fs/zfs/sys/zio.h	Wed Jun 13 16:23:58 2007 -0700
@@ -303,6 +303,7 @@
 extern int zio_alloc_blk(spa_t *spa, uint64_t size, blkptr_t *new_bp,
     blkptr_t *old_bp, uint64_t txg);
 extern void zio_free_blk(spa_t *spa, blkptr_t *bp, uint64_t txg);
+extern void zio_flush_vdev(spa_t *spa, uint64_t vdev, zio_t **zio);
 
 extern int zio_wait(zio_t *zio);
 extern void zio_nowait(zio_t *zio);
--- a/usr/src/uts/common/fs/zfs/zil.c	Wed Jun 13 15:01:11 2007 -0700
+++ b/usr/src/uts/common/fs/zfs/zil.c	Wed Jun 13 16:23:58 2007 -0700
@@ -538,23 +538,6 @@
 	}
 }
 
-/* start an async flush of the write cache for this vdev */
-void
-zil_flush_vdev(spa_t *spa, uint64_t vdev, zio_t **zio)
-{
-	vdev_t *vd;
-
-	if (*zio == NULL)
-		*zio = zio_root(spa, NULL, NULL, ZIO_FLAG_CANFAIL);
-
-	vd = vdev_lookup_top(spa, vdev);
-	ASSERT(vd);
-
-	(void) zio_nowait(zio_ioctl(*zio, spa, vd, DKIOCFLUSHWRITECACHE,
-	    NULL, NULL, ZIO_PRIORITY_NOW,
-	    ZIO_FLAG_CANFAIL | ZIO_FLAG_DONT_RETRY));
-}
-
 void
 zil_flush_vdevs(zilog_t *zilog)
 {
@@ -574,14 +557,14 @@
 		for (j = 0; j < 8; j++) {
 			if (b & (1 << j)) {
 				vdev = (i << 3) + j;
-				zil_flush_vdev(spa, vdev, &zio);
+				zio_flush_vdev(spa, vdev, &zio);
 			}
 		}
 		zilog->zl_vdev_bmap[i] = 0;
 	}
 
 	while ((zv = list_head(&zilog->zl_vdev_list)) != NULL) {
-		zil_flush_vdev(spa, zv->vdev, &zio);
+		zio_flush_vdev(spa, zv->vdev, &zio);
 		list_remove(&zilog->zl_vdev_list, zv);
 		kmem_free(zv, sizeof (zil_vdev_t));
 	}
--- a/usr/src/uts/common/fs/zfs/zio.c	Wed Jun 13 15:01:11 2007 -0700
+++ b/usr/src/uts/common/fs/zfs/zio.c	Wed Jun 13 16:23:58 2007 -0700
@@ -1810,3 +1810,29 @@
 
 	spa_config_exit(spa, FTAG);
 }
+
+/*
+ * start an async flush of the write cache for this vdev
+ */
+void
+zio_flush_vdev(spa_t *spa, uint64_t vdev, zio_t **zio)
+{
+	vdev_t *vd;
+
+	/*
+	 * Lock out configuration changes.
+	 */
+	spa_config_enter(spa, RW_READER, FTAG);
+
+	if (*zio == NULL)
+		*zio = zio_root(spa, NULL, NULL, ZIO_FLAG_CANFAIL);
+
+	vd = vdev_lookup_top(spa, vdev);
+	ASSERT(vd);
+
+	(void) zio_nowait(zio_ioctl(*zio, spa, vd, DKIOCFLUSHWRITECACHE,
+	    NULL, NULL, ZIO_PRIORITY_NOW,
+	    ZIO_FLAG_CANFAIL | ZIO_FLAG_DONT_RETRY));
+
+	spa_config_exit(spa, FTAG);
+}