]> granicus.if.org Git - zfs/commitdiff
mzap_upgrade() must use kmem_alloc()
authorBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 22 Aug 2012 03:53:01 +0000 (20:53 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 27 Aug 2012 19:01:37 +0000 (12:01 -0700)
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 <behlendorf1@llnl.gov>
module/zfs/zap_micro.c

index bd3d4a8d8547c3af1d4821f06b93fb7aecad09a4..3072475f2740337a5eaf64b78dba8d030c3b6c56 100644 (file)
@@ -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);
 }