From: Brian Behlendorf Date: Wed, 22 Aug 2012 03:53:01 +0000 (-0700) Subject: mzap_upgrade() must use kmem_alloc() X-Git-Tag: zfs-0.6.0-rc11~31 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=991fc1d7ae2589c01a939a9cbd0e866c90fdd03b;p=zfs mzap_upgrade() must use kmem_alloc() These allocations in mzap_update() used to be kmem_alloc() but were changed to vmem_alloc() due to the size of the allocation. However, since it turns out this function may be called in the context of the txg_sync thread they must be changed back to use a kmem_alloc() to ensure the KM_PUSHPAGE flag is honored. Signed-off-by: Brian Behlendorf --- diff --git a/module/zfs/zap_micro.c b/module/zfs/zap_micro.c index bd3d4a8d8..3072475f2 100644 --- a/module/zfs/zap_micro.c +++ b/module/zfs/zap_micro.c @@ -533,7 +533,7 @@ mzap_upgrade(zap_t **zapp, dmu_tx_t *tx, zap_flags_t flags) ASSERT(RW_WRITE_HELD(&zap->zap_rwlock)); sz = zap->zap_dbuf->db_size; - mzp = vmem_alloc(sz, KM_SLEEP); + mzp = kmem_alloc(sz, KM_PUSHPAGE | KM_NODEBUG); bcopy(zap->zap_dbuf->db_data, mzp, sz); nchunks = zap->zap_m.zap_num_chunks; @@ -541,7 +541,7 @@ mzap_upgrade(zap_t **zapp, dmu_tx_t *tx, zap_flags_t flags) err = dmu_object_set_blocksize(zap->zap_objset, zap->zap_object, 1ULL << fzap_default_block_shift, 0, tx); if (err) { - vmem_free(mzp, sz); + kmem_free(mzp, sz); return (err); } } @@ -567,7 +567,7 @@ mzap_upgrade(zap_t **zapp, dmu_tx_t *tx, zap_flags_t flags) if (err) break; } - vmem_free(mzp, sz); + kmem_free(mzp, sz); *zapp = zap; return (err); }