Print this page
patch first-pass


 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 =