--- a/usr/src/uts/common/fs/zfs/dbuf.c Tue Feb 20 17:28:27 2007 -0800
+++ b/usr/src/uts/common/fs/zfs/dbuf.c Tue Feb 20 22:55:55 2007 -0800
@@ -2061,6 +2061,7 @@
uint64_t txg = tx->tx_txg;
zbookmark_t zb;
zio_t *zio;
+ int zio_flags;
if (parent != dn->dn_dbuf) {
ASSERT(parent && parent->db_data_pending);
@@ -2083,6 +2084,9 @@
zb.zb_level = db->db_level;
zb.zb_blkid = db->db_blkid;
+ zio_flags = ZIO_FLAG_MUSTSUCCEED;
+ if (dmu_ot[dn->dn_type].ot_metadata || zb.zb_level != 0)
+ zio_flags |= ZIO_FLAG_METADATA;
if (BP_IS_OLDER(db->db_blkptr, txg))
dsl_dataset_block_kill(
os->os_dsl_dataset, db->db_blkptr, zio, tx);
@@ -2090,7 +2094,7 @@
dr->dr_zio = arc_write(zio, os->os_spa, checksum, compress,
dmu_get_replication_level(os->os_spa, &zb, dn->dn_type), txg,
db->db_blkptr, data, dbuf_write_ready, dbuf_write_done, db,
- ZIO_PRIORITY_ASYNC_WRITE, ZIO_FLAG_MUSTSUCCEED, &zb);
+ ZIO_PRIORITY_ASYNC_WRITE, zio_flags, &zb);
}
/* ARGSUSED */
--- a/usr/src/uts/common/fs/zfs/dmu.c Tue Feb 20 17:28:27 2007 -0800
+++ b/usr/src/uts/common/fs/zfs/dmu.c Tue Feb 20 22:55:55 2007 -0800
@@ -672,6 +672,7 @@
dmu_sync_arg_t *in;
zbookmark_t zb;
zio_t *zio;
+ int zio_flags;
int err;
ASSERT(BP_IS_HOLE(bp));
@@ -782,12 +783,15 @@
zb.zb_object = db->db.db_object;
zb.zb_level = db->db_level;
zb.zb_blkid = db->db_blkid;
+ zio_flags = ZIO_FLAG_MUSTSUCCEED;
+ if (dmu_ot[db->db_dnode->dn_type].ot_metadata || zb.zb_level != 0)
+ zio_flags |= ZIO_FLAG_METADATA;
zio = arc_write(pio, os->os_spa,
zio_checksum_select(db->db_dnode->dn_checksum, os->os_checksum),
zio_compress_select(db->db_dnode->dn_compress, os->os_compress),
dmu_get_replication_level(os->os_spa, &zb, db->db_dnode->dn_type),
txg, bp, dr->dt.dl.dr_data, NULL, dmu_sync_done, in,
- ZIO_PRIORITY_SYNC_WRITE, ZIO_FLAG_MUSTSUCCEED, &zb);
+ ZIO_PRIORITY_SYNC_WRITE, zio_flags, &zb);
if (pio) {
zio_nowait(zio);
--- a/usr/src/uts/common/fs/zfs/dmu_objset.c Tue Feb 20 17:28:27 2007 -0800
+++ b/usr/src/uts/common/fs/zfs/dmu_objset.c Tue Feb 20 22:55:55 2007 -0800
@@ -744,6 +744,7 @@
zio_t *zio;
list_t *list;
dbuf_dirty_record_t *dr;
+ int zio_flags;
dprintf_ds(os->os_dsl_dataset, "txg=%llu\n", tx->tx_txg);
@@ -758,6 +759,9 @@
zb.zb_object = 0;
zb.zb_level = -1;
zb.zb_blkid = 0;
+ zio_flags = ZIO_FLAG_MUSTSUCCEED;
+ if (dmu_ot[DMU_OT_OBJSET].ot_metadata || zb.zb_level != 0)
+ zio_flags |= ZIO_FLAG_METADATA;
if (BP_IS_OLDER(os->os_rootbp, tx->tx_txg))
dsl_dataset_block_kill(os->os_dsl_dataset,
os->os_rootbp, pio, tx);
@@ -765,7 +769,7 @@
os->os_md_compress,
dmu_get_replication_level(os->os_spa, &zb, DMU_OT_OBJSET),
tx->tx_txg, os->os_rootbp, os->os_phys_buf, ready, killer, os,
- ZIO_PRIORITY_ASYNC_WRITE, ZIO_FLAG_MUSTSUCCEED, &zb);
+ ZIO_PRIORITY_ASYNC_WRITE, zio_flags, &zb);
/*
* Sync meta-dnode - the parent IO for the sync is the root block
--- a/usr/src/uts/common/fs/zfs/sys/zio.h Tue Feb 20 17:28:27 2007 -0800
+++ b/usr/src/uts/common/fs/zfs/sys/zio.h Tue Feb 20 22:55:55 2007 -0800
@@ -133,6 +133,8 @@
#define ZIO_FLAG_NOBOOKMARK 0x10000
#define ZIO_FLAG_USER 0x20000
+#define ZIO_FLAG_METADATA 0x40000
+
#define ZIO_FLAG_GANG_INHERIT \
(ZIO_FLAG_CANFAIL | \
ZIO_FLAG_FAILFAST | \
--- a/usr/src/uts/common/fs/zfs/zio.c Tue Feb 20 17:28:27 2007 -0800
+++ b/usr/src/uts/common/fs/zfs/zio.c Tue Feb 20 22:55:55 2007 -0800
@@ -1702,7 +1702,18 @@
ASSERT(zio->io_stage <= ZIO_STAGE_DONE);
ASSERT(zio->io_stalled == 0);
- zio_pipeline[zio->io_stage](zio);
+ /*
+ * See the comment in zio_next_stage_async() about per-CPU taskqs.
+ */
+ if (((1U << zio->io_stage) & zio->io_async_stages) &&
+ (zio->io_stage == ZIO_STAGE_WRITE_COMPRESS) &&
+ !(zio->io_flags & ZIO_FLAG_METADATA)) {
+ taskq_t *tq = zio->io_spa->spa_zio_issue_taskq[zio->io_type];
+ (void) taskq_dispatch(tq,
+ (task_func_t *)zio_pipeline[zio->io_stage], zio, TQ_SLEEP);
+ } else {
+ zio_pipeline[zio->io_stage](zio);
+ }
}
void