372
373 zap = kmem_zalloc(sizeof (zap_t), KM_SLEEP);
374 rw_init(&zap->zap_rwlock, 0, 0, 0);
375 rw_enter(&zap->zap_rwlock, RW_WRITER);
376 zap->zap_objset = os;
377 zap->zap_object = obj;
378 zap->zap_dbuf = db;
379
380 if (*(uint64_t *)db->db_data != ZBT_MICRO) {
381 mutex_init(&zap->zap_f.zap_num_entries_mtx, 0, 0, 0);
382 zap->zap_f.zap_block_shift = highbit64(db->db_size) - 1;
383 } else {
384 zap->zap_ismicro = TRUE;
385 }
386
387 /*
388 * Make sure that zap_ismicro is set before we let others see
389 * it, because zap_lockdir() checks zap_ismicro without the lock
390 * held.
391 */
392 dmu_buf_init_user(&zap->zap_dbu, zap_evict, &zap->zap_dbuf);
393 winner = dmu_buf_set_user(db, &zap->zap_dbu);
394
395 if (winner != NULL) {
396 rw_exit(&zap->zap_rwlock);
397 rw_destroy(&zap->zap_rwlock);
398 if (!zap->zap_ismicro)
399 mutex_destroy(&zap->zap_f.zap_num_entries_mtx);
400 kmem_free(zap, sizeof (zap_t));
401 return (winner);
402 }
403
404 if (zap->zap_ismicro) {
405 zap->zap_salt = zap_m_phys(zap)->mz_salt;
406 zap->zap_normflags = zap_m_phys(zap)->mz_normflags;
407 zap->zap_m.zap_num_chunks = db->db_size / MZAP_ENT_LEN - 1;
408 avl_create(&zap->zap_m.zap_avl, mze_compare,
409 sizeof (mzap_ent_t), offsetof(mzap_ent_t, mze_node));
410
411 for (i = 0; i < zap->zap_m.zap_num_chunks; i++) {
412 mzap_ent_phys_t *mze =
|
372
373 zap = kmem_zalloc(sizeof (zap_t), KM_SLEEP);
374 rw_init(&zap->zap_rwlock, 0, 0, 0);
375 rw_enter(&zap->zap_rwlock, RW_WRITER);
376 zap->zap_objset = os;
377 zap->zap_object = obj;
378 zap->zap_dbuf = db;
379
380 if (*(uint64_t *)db->db_data != ZBT_MICRO) {
381 mutex_init(&zap->zap_f.zap_num_entries_mtx, 0, 0, 0);
382 zap->zap_f.zap_block_shift = highbit64(db->db_size) - 1;
383 } else {
384 zap->zap_ismicro = TRUE;
385 }
386
387 /*
388 * Make sure that zap_ismicro is set before we let others see
389 * it, because zap_lockdir() checks zap_ismicro without the lock
390 * held.
391 */
392 dmu_buf_init_user(&zap->zap_dbu, NULL, zap_evict, &zap->zap_dbuf);
393 winner = dmu_buf_set_user(db, &zap->zap_dbu);
394
395 if (winner != NULL) {
396 rw_exit(&zap->zap_rwlock);
397 rw_destroy(&zap->zap_rwlock);
398 if (!zap->zap_ismicro)
399 mutex_destroy(&zap->zap_f.zap_num_entries_mtx);
400 kmem_free(zap, sizeof (zap_t));
401 return (winner);
402 }
403
404 if (zap->zap_ismicro) {
405 zap->zap_salt = zap_m_phys(zap)->mz_salt;
406 zap->zap_normflags = zap_m_phys(zap)->mz_normflags;
407 zap->zap_m.zap_num_chunks = db->db_size / MZAP_ENT_LEN - 1;
408 avl_create(&zap->zap_m.zap_avl, mze_compare,
409 sizeof (mzap_ent_t), offsetof(mzap_ent_t, mze_node));
410
411 for (i = 0; i < zap->zap_m.zap_num_chunks; i++) {
412 mzap_ent_phys_t *mze =
|