Mercurial > illumos > illumos-gate
changeset 3689:75b45bbf8f18 onnv_59
6460622 zio_nowait() doesn't live up to its name
author | ek110237 |
---|---|
date | Tue, 20 Feb 2007 22:55:55 -0800 |
parents | bd23485682e4 |
children | 2804232c1017 |
files | usr/src/uts/common/fs/zfs/dbuf.c usr/src/uts/common/fs/zfs/dmu.c usr/src/uts/common/fs/zfs/dmu_objset.c usr/src/uts/common/fs/zfs/sys/zio.h usr/src/uts/common/fs/zfs/zio.c |
diffstat | 5 files changed, 29 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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