--- 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);
+}