Lines Matching defs:zap
47 #include <sys/zap.h>
54 extern inline zap_phys_t *zap_f_phys(zap_t *zap);
56 static uint64_t zap_allocate_blocks(zap_t *zap, int nblocks);
74 fzap_upgrade(zap_t *zap, dmu_tx_t *tx, zap_flags_t flags)
81 ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
82 zap->zap_ismicro = FALSE;
84 zap->zap_dbu.dbu_evict_func_sync = zap_evict_sync;
85 zap->zap_dbu.dbu_evict_func_async = NULL;
87 mutex_init(&zap->zap_f.zap_num_entries_mtx, 0, 0, 0);
88 zap->zap_f.zap_block_shift = highbit64(zap->zap_dbuf->db_size) - 1;
90 zp = zap_f_phys(zap);
95 bzero(zap->zap_dbuf->db_data, zap->zap_dbuf->db_size);
99 zp->zap_ptrtbl.zt_shift = ZAP_EMBEDDED_PTRTBL_SHIFT(zap);
104 zp->zap_salt = zap->zap_salt;
105 zp->zap_normflags = zap->zap_normflags;
110 ZAP_EMBEDDED_PTRTBL_ENT(zap, i) = 1;
115 VERIFY(0 == dmu_buf_hold(zap->zap_objset, zap->zap_object,
116 1<<FZAP_BLOCK_SHIFT(zap), FTAG, &db, DMU_READ_NO_PREFETCH));
129 zap_tryupgradedir(zap_t *zap, dmu_tx_t *tx)
131 if (RW_WRITE_HELD(&zap->zap_rwlock))
133 if (rw_tryupgrade(&zap->zap_rwlock)) {
134 dmu_buf_will_dirty(zap->zap_dbuf, tx);
145 zap_table_grow(zap_t *zap, zap_table_phys_t *tbl,
152 int bs = FZAP_BLOCK_SHIFT(zap);
156 ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
163 newblk = zap_allocate_blocks(zap, tbl->zt_numblks * 2);
166 dmu_prefetch(zap->zap_objset, zap->zap_object, 0,
176 err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
182 VERIFY(0 == dmu_buf_hold(zap->zap_objset, zap->zap_object,
189 VERIFY(0 == dmu_buf_hold(zap->zap_objset, zap->zap_object,
204 (void) dmu_free_range(zap->zap_objset, zap->zap_object,
221 zap_table_store(zap_t *zap, zap_table_phys_t *tbl, uint64_t idx, uint64_t val,
226 int bs = FZAP_BLOCK_SHIFT(zap);
229 ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
237 err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
249 err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
269 zap_table_load(zap_t *zap, zap_table_phys_t *tbl, uint64_t idx, uint64_t *valp)
275 int bs = FZAP_BLOCK_SHIFT(zap);
277 ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
287 dn = dmu_buf_dnode_enter(zap->zap_dbuf);
290 dmu_buf_dnode_exit(zap->zap_dbuf);
304 dn = dmu_buf_dnode_enter(zap->zap_dbuf);
308 dmu_buf_dnode_exit(zap->zap_dbuf);
331 zap_grow_ptrtbl(zap_t *zap, dmu_tx_t *tx)
339 if (zap_f_phys(zap)->zap_ptrtbl.zt_shift >= zap_hashbits(zap) - 2)
342 if (zap_f_phys(zap)->zap_ptrtbl.zt_numblks == 0) {
352 ASSERT3U(zap_f_phys(zap)->zap_ptrtbl.zt_shift, ==,
353 ZAP_EMBEDDED_PTRTBL_SHIFT(zap));
354 ASSERT0(zap_f_phys(zap)->zap_ptrtbl.zt_blk);
356 newblk = zap_allocate_blocks(zap, 1);
357 err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
358 newblk << FZAP_BLOCK_SHIFT(zap), FTAG, &db_new,
363 zap_ptrtbl_transfer(&ZAP_EMBEDDED_PTRTBL_ENT(zap, 0),
364 db_new->db_data, 1 << ZAP_EMBEDDED_PTRTBL_SHIFT(zap));
367 zap_f_phys(zap)->zap_ptrtbl.zt_blk = newblk;
368 zap_f_phys(zap)->zap_ptrtbl.zt_numblks = 1;
369 zap_f_phys(zap)->zap_ptrtbl.zt_shift++;
371 ASSERT3U(1ULL << zap_f_phys(zap)->zap_ptrtbl.zt_shift, ==,
372 zap_f_phys(zap)->zap_ptrtbl.zt_numblks <<
373 (FZAP_BLOCK_SHIFT(zap)-3));
377 return (zap_table_grow(zap, &zap_f_phys(zap)->zap_ptrtbl,
383 zap_increment_num_entries(zap_t *zap, int delta, dmu_tx_t *tx)
385 dmu_buf_will_dirty(zap->zap_dbuf, tx);
386 mutex_enter(&zap->zap_f.zap_num_entries_mtx);
387 ASSERT(delta > 0 || zap_f_phys(zap)->zap_num_entries >= -delta);
388 zap_f_phys(zap)->zap_num_entries += delta;
389 mutex_exit(&zap->zap_f.zap_num_entries_mtx);
393 zap_allocate_blocks(zap_t *zap, int nblocks)
396 ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
397 newblk = zap_f_phys(zap)->zap_freeblk;
398 zap_f_phys(zap)->zap_freeblk += nblocks;
412 zap_create_leaf(zap_t *zap, dmu_tx_t *tx)
417 ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
421 l->l_blkid = zap_allocate_blocks(zap, 1);
424 VERIFY(0 == dmu_buf_hold(zap->zap_objset, zap->zap_object,
425 l->l_blkid << FZAP_BLOCK_SHIFT(zap), NULL, &l->l_dbuf,
432 zap_leaf_init(l, zap->zap_normflags != 0);
434 zap_f_phys(zap)->zap_num_leafs++;
440 fzap_count(zap_t *zap, uint64_t *count)
442 ASSERT(!zap->zap_ismicro);
443 mutex_enter(&zap->zap_f.zap_num_entries_mtx); /* unnecessary */
444 *count = zap_f_phys(zap)->zap_num_entries;
445 mutex_exit(&zap->zap_f.zap_num_entries_mtx);
509 zap_get_leaf_byblk(zap_t *zap, uint64_t blkid, dmu_tx_t *tx, krw_t lt,
514 int bs = FZAP_BLOCK_SHIFT(zap);
517 ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
519 dnode_t *dn = dmu_buf_dnode_enter(zap->zap_dbuf);
522 dmu_buf_dnode_exit(zap->zap_dbuf);
526 ASSERT3U(db->db_object, ==, zap->zap_object);
553 zap_idx_to_blk(zap_t *zap, uint64_t idx, uint64_t *valp)
555 ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
557 if (zap_f_phys(zap)->zap_ptrtbl.zt_numblks == 0) {
559 (1ULL << zap_f_phys(zap)->zap_ptrtbl.zt_shift));
560 *valp = ZAP_EMBEDDED_PTRTBL_ENT(zap, idx);
563 return (zap_table_load(zap, &zap_f_phys(zap)->zap_ptrtbl,
569 zap_set_idx_to_blk(zap_t *zap, uint64_t idx, uint64_t blk, dmu_tx_t *tx)
572 ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
574 if (zap_f_phys(zap)->zap_ptrtbl.zt_blk == 0) {
575 ZAP_EMBEDDED_PTRTBL_ENT(zap, idx) = blk;
578 return (zap_table_store(zap, &zap_f_phys(zap)->zap_ptrtbl,
584 zap_deref_leaf(zap_t *zap, uint64_t h, dmu_tx_t *tx, krw_t lt, zap_leaf_t **lp)
589 ASSERT(zap->zap_dbuf == NULL ||
590 zap_f_phys(zap) == zap->zap_dbuf->db_data);
592 /* Reality check for corrupt zap objects (leaf or header). */
593 if ((zap_f_phys(zap)->zap_block_type != ZBT_LEAF &&
594 zap_f_phys(zap)->zap_block_type != ZBT_HEADER) ||
595 zap_f_phys(zap)->zap_magic != ZAP_MAGIC) {
599 idx = ZAP_HASH_IDX(h, zap_f_phys(zap)->zap_ptrtbl.zt_shift);
600 err = zap_idx_to_blk(zap, idx, &blk);
603 err = zap_get_leaf_byblk(zap, blk, tx, lt, lp);
615 zap_t *zap = zn->zn_zap;
622 ASSERT3U(old_prefix_len, <=, zap_f_phys(zap)->zap_ptrtbl.zt_shift);
623 ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
628 if (zap_tryupgradedir(zap, tx) == 0 ||
629 old_prefix_len == zap_f_phys(zap)->zap_ptrtbl.zt_shift) {
631 objset_t *os = zap->zap_objset;
632 uint64_t object = zap->zap_object;
635 zap_unlockdir(zap, tag);
638 zap = zn->zn_zap;
641 ASSERT(!zap->zap_ismicro);
644 zap_f_phys(zap)->zap_ptrtbl.zt_shift) {
645 err = zap_grow_ptrtbl(zap, tx);
650 err = zap_deref_leaf(zap, hash, tx, RW_WRITER, &l);
660 ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
661 ASSERT3U(old_prefix_len, <, zap_f_phys(zap)->zap_ptrtbl.zt_shift);
665 prefix_diff = zap_f_phys(zap)->zap_ptrtbl.zt_shift -
672 err = zap_idx_to_blk(zap, sibling+i, &blk);
678 nl = zap_create_leaf(zap, tx);
679 zap_leaf_split(l, nl, zap->zap_normflags != 0);
683 err = zap_set_idx_to_blk(zap, sibling+i, nl->l_blkid, tx);
703 zap_t *zap = zn->zn_zap;
704 int shift = zap_f_phys(zap)->zap_ptrtbl.zt_shift;
710 if (leaffull || zap_f_phys(zap)->zap_ptrtbl.zt_nextblk) {
717 if (zap_tryupgradedir(zap, tx) == 0) {
718 objset_t *os = zap->zap_objset;
719 uint64_t zapobj = zap->zap_object;
721 zap_unlockdir(zap, tag);
724 zap = zn->zn_zap;
730 if (zap_f_phys(zap)->zap_ptrtbl.zt_shift == shift)
731 (void) zap_grow_ptrtbl(zap, tx);
818 zap_t *zap = zn->zn_zap;
820 ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
821 ASSERT(!zap->zap_ismicro);
824 err = zap_deref_leaf(zap, zn->zn_hash, tx, RW_WRITER, &l);
840 zap_increment_num_entries(zap, 1, tx);
843 zap = zn->zn_zap; /* zap_expand_leaf() may change zap */
849 if (zap != NULL)
875 zap_t *zap = zn->zn_zap;
877 ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
882 err = zap_deref_leaf(zap, zn->zn_hash, tx, RW_WRITER, &l);
894 zap_increment_num_entries(zap, 1, tx);
901 zap = zn->zn_zap; /* zap_expand_leaf() may change zap */
906 if (zap != NULL)
958 zap_t *zap = zn->zn_zap;
962 zap_f_phys(zap)->zap_ptrtbl.zt_shift);
963 if (zap_idx_to_blk(zap, idx, &blk) != 0)
965 bs = FZAP_BLOCK_SHIFT(zap);
966 dmu_prefetch(zap->zap_objset, zap->zap_object, 0, blk << bs, 1 << bs,
1184 fzap_cursor_retrieve(zap_t *zap, zap_cursor_t *zc, zap_attribute_t *za)
1204 err = zap_deref_leaf(zap, zc->zc_hash, NULL, RW_READER,
1241 err = zap_entry_read_name(zap, &zeh,
1247 NULL, za->za_name, zap);
1254 zap_stats_ptrtbl(zap_t *zap, uint64_t *tbl, int len, zap_stats_t *zs)
1271 err = zap_get_leaf_byblk(zap, tbl[i], NULL, RW_READER, &l);
1273 zap_leaf_stats(zap, l, zs);
1280 fzap_get_stats(zap_t *zap, zap_stats_t *zs)
1282 int bs = FZAP_BLOCK_SHIFT(zap);
1288 zs->zs_num_leafs = zap_f_phys(zap)->zap_num_leafs;
1289 zs->zs_num_entries = zap_f_phys(zap)->zap_num_entries;
1290 zs->zs_num_blocks = zap_f_phys(zap)->zap_freeblk;
1291 zs->zs_block_type = zap_f_phys(zap)->zap_block_type;
1292 zs->zs_magic = zap_f_phys(zap)->zap_magic;
1293 zs->zs_salt = zap_f_phys(zap)->zap_salt;
1298 zs->zs_ptrtbl_len = 1ULL << zap_f_phys(zap)->zap_ptrtbl.zt_shift;
1299 zs->zs_ptrtbl_nextblk = zap_f_phys(zap)->zap_ptrtbl.zt_nextblk;
1301 zap_f_phys(zap)->zap_ptrtbl.zt_blks_copied;
1302 zs->zs_ptrtbl_zt_blk = zap_f_phys(zap)->zap_ptrtbl.zt_blk;
1303 zs->zs_ptrtbl_zt_numblks = zap_f_phys(zap)->zap_ptrtbl.zt_numblks;
1304 zs->zs_ptrtbl_zt_shift = zap_f_phys(zap)->zap_ptrtbl.zt_shift;
1306 if (zap_f_phys(zap)->zap_ptrtbl.zt_numblks == 0) {
1308 zap_stats_ptrtbl(zap, &ZAP_EMBEDDED_PTRTBL_ENT(zap, 0),
1309 1 << ZAP_EMBEDDED_PTRTBL_SHIFT(zap), zs);
1313 dmu_prefetch(zap->zap_objset, zap->zap_object, 0,
1314 zap_f_phys(zap)->zap_ptrtbl.zt_blk << bs,
1315 zap_f_phys(zap)->zap_ptrtbl.zt_numblks << bs,
1318 for (b = 0; b < zap_f_phys(zap)->zap_ptrtbl.zt_numblks;
1323 err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
1324 (zap_f_phys(zap)->zap_ptrtbl.zt_blk + b) << bs,
1327 zap_stats_ptrtbl(zap, db->db_data,
1339 zap_t *zap = zn->zn_zap;
1346 if (!add && dmu_buf_freeable(zap->zap_dbuf)) {
1348 zap->zap_dbuf->db_size, FTAG);
1351 zap->zap_dbuf->db_size, FTAG);
1363 if (zap_f_phys(zap)->zap_ptrtbl.zt_blk == 0) {
1365 zap->zap_dbuf->db_size, FTAG);
1368 zap->zap_dbuf->db_size * 3, FTAG);
1376 err = zap_deref_leaf(zap, zn->zn_hash, NULL, RW_READER, &l);