• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-12-stable/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/

Lines Matching refs:zap

47 #include <sys/zap.h>
84 extern inline zap_phys_t *zap_f_phys(zap_t *zap);
86 static uint64_t zap_allocate_blocks(zap_t *zap, int nblocks);
102 fzap_upgrade(zap_t *zap, dmu_tx_t *tx, zap_flags_t flags)
104 ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
105 zap->zap_ismicro = FALSE;
107 zap->zap_dbu.dbu_evict_func_sync = zap_evict_sync;
108 zap->zap_dbu.dbu_evict_func_async = NULL;
110 mutex_init(&zap->zap_f.zap_num_entries_mtx, 0, 0, 0);
111 zap->zap_f.zap_block_shift = highbit64(zap->zap_dbuf->db_size) - 1;
113 zap_phys_t *zp = zap_f_phys(zap);
118 bzero(zap->zap_dbuf->db_data, zap->zap_dbuf->db_size);
122 zp->zap_ptrtbl.zt_shift = ZAP_EMBEDDED_PTRTBL_SHIFT(zap);
127 zp->zap_salt = zap->zap_salt;
128 zp->zap_normflags = zap->zap_normflags;
133 ZAP_EMBEDDED_PTRTBL_ENT(zap, i) = 1;
139 VERIFY0(dmu_buf_hold(zap->zap_objset, zap->zap_object,
140 1<<FZAP_BLOCK_SHIFT(zap), FTAG, &db, DMU_READ_NO_PREFETCH));
153 zap_tryupgradedir(zap_t *zap, dmu_tx_t *tx)
155 if (RW_WRITE_HELD(&zap->zap_rwlock))
157 if (rw_tryupgrade(&zap->zap_rwlock)) {
158 dmu_buf_will_dirty(zap->zap_dbuf, tx);
169 zap_table_grow(zap_t *zap, zap_table_phys_t *tbl,
174 int bs = FZAP_BLOCK_SHIFT(zap);
178 ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
185 newblk = zap_allocate_blocks(zap, tbl->zt_numblks * 2);
188 dmu_prefetch(zap->zap_objset, zap->zap_object, 0,
199 int err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
206 VERIFY0(dmu_buf_hold(zap->zap_objset, zap->zap_object,
213 VERIFY0(dmu_buf_hold(zap->zap_objset, zap->zap_object,
228 (void) dmu_free_range(zap->zap_objset, zap->zap_object,
245 zap_table_store(zap_t *zap, zap_table_phys_t *tbl, uint64_t idx, uint64_t val,
248 int bs = FZAP_BLOCK_SHIFT(zap);
250 ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
259 int err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
271 err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
291 zap_table_load(zap_t *zap, zap_table_phys_t *tbl, uint64_t idx, uint64_t *valp)
293 int bs = FZAP_BLOCK_SHIFT(zap);
295 ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
305 dnode_t *dn = dmu_buf_dnode_enter(zap->zap_dbuf);
309 dmu_buf_dnode_exit(zap->zap_dbuf);
323 dn = dmu_buf_dnode_enter(zap->zap_dbuf);
327 dmu_buf_dnode_exit(zap->zap_dbuf);
349 zap_grow_ptrtbl(zap_t *zap, dmu_tx_t *tx)
357 if (zap_f_phys(zap)->zap_ptrtbl.zt_shift >= zap_hashbits(zap) - 2)
360 if (zap_f_phys(zap)->zap_ptrtbl.zt_numblks == 0) {
366 ASSERT3U(zap_f_phys(zap)->zap_ptrtbl.zt_shift, ==,
367 ZAP_EMBEDDED_PTRTBL_SHIFT(zap));
368 ASSERT0(zap_f_phys(zap)->zap_ptrtbl.zt_blk);
370 uint64_t newblk = zap_allocate_blocks(zap, 1);
372 int err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
373 newblk << FZAP_BLOCK_SHIFT(zap), FTAG, &db_new,
378 zap_ptrtbl_transfer(&ZAP_EMBEDDED_PTRTBL_ENT(zap, 0),
379 db_new->db_data, 1 << ZAP_EMBEDDED_PTRTBL_SHIFT(zap));
382 zap_f_phys(zap)->zap_ptrtbl.zt_blk = newblk;
383 zap_f_phys(zap)->zap_ptrtbl.zt_numblks = 1;
384 zap_f_phys(zap)->zap_ptrtbl.zt_shift++;
386 ASSERT3U(1ULL << zap_f_phys(zap)->zap_ptrtbl.zt_shift, ==,
387 zap_f_phys(zap)->zap_ptrtbl.zt_numblks <<
388 (FZAP_BLOCK_SHIFT(zap)-3));
392 return (zap_table_grow(zap, &zap_f_phys(zap)->zap_ptrtbl,
398 zap_increment_num_entries(zap_t *zap, int delta, dmu_tx_t *tx)
400 dmu_buf_will_dirty(zap->zap_dbuf, tx);
401 mutex_enter(&zap->zap_f.zap_num_entries_mtx);
402 ASSERT(delta > 0 || zap_f_phys(zap)->zap_num_entries >= -delta);
403 zap_f_phys(zap)->zap_num_entries += delta;
404 mutex_exit(&zap->zap_f.zap_num_entries_mtx);
408 zap_allocate_blocks(zap_t *zap, int nblocks)
410 ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
411 uint64_t newblk = zap_f_phys(zap)->zap_freeblk;
412 zap_f_phys(zap)->zap_freeblk += nblocks;
426 zap_create_leaf(zap_t *zap, dmu_tx_t *tx)
430 ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
434 l->l_blkid = zap_allocate_blocks(zap, 1);
437 VERIFY0(dmu_buf_hold(zap->zap_objset, zap->zap_object,
438 l->l_blkid << FZAP_BLOCK_SHIFT(zap), NULL, &l->l_dbuf,
444 zap_leaf_init(l, zap->zap_normflags != 0);
446 zap_f_phys(zap)->zap_num_leafs++;
452 fzap_count(zap_t *zap, uint64_t *count)
454 ASSERT(!zap->zap_ismicro);
455 mutex_enter(&zap->zap_f.zap_num_entries_mtx); /* unnecessary */
456 *count = zap_f_phys(zap)->zap_num_entries;
457 mutex_exit(&zap->zap_f.zap_num_entries_mtx);
519 zap_get_leaf_byblk(zap_t *zap, uint64_t blkid, dmu_tx_t *tx, krw_t lt,
524 ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
526 int bs = FZAP_BLOCK_SHIFT(zap);
527 dnode_t *dn = dmu_buf_dnode_enter(zap->zap_dbuf);
530 dmu_buf_dnode_exit(zap->zap_dbuf);
534 ASSERT3U(db->db_object, ==, zap->zap_object);
561 zap_idx_to_blk(zap_t *zap, uint64_t idx, uint64_t *valp)
563 ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
565 if (zap_f_phys(zap)->zap_ptrtbl.zt_numblks == 0) {
567 (1ULL << zap_f_phys(zap)->zap_ptrtbl.zt_shift));
568 *valp = ZAP_EMBEDDED_PTRTBL_ENT(zap, idx);
571 return (zap_table_load(zap, &zap_f_phys(zap)->zap_ptrtbl,
577 zap_set_idx_to_blk(zap_t *zap, uint64_t idx, uint64_t blk, dmu_tx_t *tx)
580 ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
582 if (zap_f_phys(zap)->zap_ptrtbl.zt_blk == 0) {
583 ZAP_EMBEDDED_PTRTBL_ENT(zap, idx) = blk;
586 return (zap_table_store(zap, &zap_f_phys(zap)->zap_ptrtbl,
592 zap_deref_leaf(zap_t *zap, uint64_t h, dmu_tx_t *tx, krw_t lt, zap_leaf_t **lp)
596 ASSERT(zap->zap_dbuf == NULL ||
597 zap_f_phys(zap) == zap->zap_dbuf->db_data);
599 /* Reality check for corrupt zap objects (leaf or header). */
600 if ((zap_f_phys(zap)->zap_block_type != ZBT_LEAF &&
601 zap_f_phys(zap)->zap_block_type != ZBT_HEADER) ||
602 zap_f_phys(zap)->zap_magic != ZAP_MAGIC) {
606 uint64_t idx = ZAP_HASH_IDX(h, zap_f_phys(zap)->zap_ptrtbl.zt_shift);
607 int err = zap_idx_to_blk(zap, idx, &blk);
610 err = zap_get_leaf_byblk(zap, blk, tx, lt, lp);
622 zap_t *zap = zn->zn_zap;
627 ASSERT3U(old_prefix_len, <=, zap_f_phys(zap)->zap_ptrtbl.zt_shift);
628 ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
633 if (zap_tryupgradedir(zap, tx) == 0 ||
634 old_prefix_len == zap_f_phys(zap)->zap_ptrtbl.zt_shift) {
636 objset_t *os = zap->zap_objset;
637 uint64_t object = zap->zap_object;
640 zap_unlockdir(zap, tag);
643 zap = zn->zn_zap;
646 ASSERT(!zap->zap_ismicro);
649 zap_f_phys(zap)->zap_ptrtbl.zt_shift) {
650 err = zap_grow_ptrtbl(zap, tx);
655 err = zap_deref_leaf(zap, hash, tx, RW_WRITER, &l);
665 ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
666 ASSERT3U(old_prefix_len, <, zap_f_phys(zap)->zap_ptrtbl.zt_shift);
670 int prefix_diff = zap_f_phys(zap)->zap_ptrtbl.zt_shift -
678 err = zap_idx_to_blk(zap, sibling + i, &blk);
684 zap_leaf_t *nl = zap_create_leaf(zap, tx);
685 zap_leaf_split(l, nl, zap->zap_normflags != 0);
689 err = zap_set_idx_to_blk(zap, sibling + i, nl->l_blkid, tx);
709 zap_t *zap = zn->zn_zap;
710 int shift = zap_f_phys(zap)->zap_ptrtbl.zt_shift;
716 if (leaffull || zap_f_phys(zap)->zap_ptrtbl.zt_nextblk) {
721 if (zap_tryupgradedir(zap, tx) == 0) {
722 objset_t *os = zap->zap_objset;
723 uint64_t zapobj = zap->zap_object;
725 zap_unlockdir(zap, tag);
728 zap = zn->zn_zap;
734 if (zap_f_phys(zap)->zap_ptrtbl.zt_shift == shift)
735 (void) zap_grow_ptrtbl(zap, tx);
821 zap_t *zap = zn->zn_zap;
823 ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
824 ASSERT(!zap->zap_ismicro);
827 err = zap_deref_leaf(zap, zn->zn_hash, tx, RW_WRITER, &l);
843 zap_increment_num_entries(zap, 1, tx);
846 zap = zn->zn_zap; /* zap_expand_leaf() may change zap */
852 if (zap != NULL)
879 zap_t *zap = zn->zn_zap;
881 ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
886 err = zap_deref_leaf(zap, zn->zn_hash, tx, RW_WRITER, &l);
898 zap_increment_num_entries(zap, 1, tx);
905 zap = zn->zn_zap; /* zap_expand_leaf() may change zap */
910 if (zap != NULL)
962 zap_t *zap = zn->zn_zap;
965 zap_f_phys(zap)->zap_ptrtbl.zt_shift);
966 if (zap_idx_to_blk(zap, idx, &blk) != 0)
968 int bs = FZAP_BLOCK_SHIFT(zap);
969 dmu_prefetch(zap->zap_objset, zap->zap_object, 0, blk << bs, 1 << bs,
1193 fzap_cursor_retrieve(zap_t *zap, zap_cursor_t *zc, zap_attribute_t *za)
1210 zc->zc_prefetch && zap_f_phys(zap)->zap_freeblk > 2) {
1212 zap_f_phys(zap)->zap_freeblk << FZAP_BLOCK_SHIFT(zap),
1227 err = zap_deref_leaf(zap, zc->zc_hash, NULL, RW_READER,
1264 err = zap_entry_read_name(zap, &zeh,
1270 NULL, za->za_name, zap);
1277 zap_stats_ptrtbl(zap_t *zap, uint64_t *tbl, int len, zap_stats_t *zs)
1293 int err = zap_get_leaf_byblk(zap, tbl[i], NULL, RW_READER, &l);
1295 zap_leaf_stats(zap, l, zs);
1327 fzap_get_stats(zap_t *zap, zap_stats_t *zs)
1329 int bs = FZAP_BLOCK_SHIFT(zap);
1335 zs->zs_num_leafs = zap_f_phys(zap)->zap_num_leafs;
1336 zs->zs_num_entries = zap_f_phys(zap)->zap_num_entries;
1337 zs->zs_num_blocks = zap_f_phys(zap)->zap_freeblk;
1338 zs->zs_block_type = zap_f_phys(zap)->zap_block_type;
1339 zs->zs_magic = zap_f_phys(zap)->zap_magic;
1340 zs->zs_salt = zap_f_phys(zap)->zap_salt;
1345 zs->zs_ptrtbl_len = 1ULL << zap_f_phys(zap)->zap_ptrtbl.zt_shift;
1346 zs->zs_ptrtbl_nextblk = zap_f_phys(zap)->zap_ptrtbl.zt_nextblk;
1348 zap_f_phys(zap)->zap_ptrtbl.zt_blks_copied;
1349 zs->zs_ptrtbl_zt_blk = zap_f_phys(zap)->zap_ptrtbl.zt_blk;
1350 zs->zs_ptrtbl_zt_numblks = zap_f_phys(zap)->zap_ptrtbl.zt_numblks;
1351 zs->zs_ptrtbl_zt_shift = zap_f_phys(zap)->zap_ptrtbl.zt_shift;
1353 if (zap_f_phys(zap)->zap_ptrtbl.zt_numblks == 0) {
1355 zap_stats_ptrtbl(zap, &ZAP_EMBEDDED_PTRTBL_ENT(zap, 0),
1356 1 << ZAP_EMBEDDED_PTRTBL_SHIFT(zap), zs);
1358 dmu_prefetch(zap->zap_objset, zap->zap_object, 0,
1359 zap_f_phys(zap)->zap_ptrtbl.zt_blk << bs,
1360 zap_f_phys(zap)->zap_ptrtbl.zt_numblks << bs,
1363 for (int b = 0; b < zap_f_phys(zap)->zap_ptrtbl.zt_numblks;
1368 err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
1369 (zap_f_phys(zap)->zap_ptrtbl.zt_blk + b) << bs,
1372 zap_stats_ptrtbl(zap, db->db_data,