Lines Matching defs:brtvd
330 brt_vdev_entcount_get(const brt_vdev_t *brtvd, uint64_t idx)
333 ASSERT3U(idx, <, brtvd->bv_size);
335 if (unlikely(brtvd->bv_need_byteswap)) {
336 return (BSWAP_16(brtvd->bv_entcount[idx]));
338 return (brtvd->bv_entcount[idx]);
343 brt_vdev_entcount_set(brt_vdev_t *brtvd, uint64_t idx, uint16_t entcnt)
346 ASSERT3U(idx, <, brtvd->bv_size);
348 if (unlikely(brtvd->bv_need_byteswap)) {
349 brtvd->bv_entcount[idx] = BSWAP_16(entcnt);
351 brtvd->bv_entcount[idx] = entcnt;
356 brt_vdev_entcount_inc(brt_vdev_t *brtvd, uint64_t idx)
360 ASSERT3U(idx, <, brtvd->bv_size);
362 entcnt = brt_vdev_entcount_get(brtvd, idx);
365 brt_vdev_entcount_set(brtvd, idx, entcnt + 1);
369 brt_vdev_entcount_dec(brt_vdev_t *brtvd, uint64_t idx)
373 ASSERT3U(idx, <, brtvd->bv_size);
375 entcnt = brt_vdev_entcount_get(brtvd, idx);
378 brt_vdev_entcount_set(brtvd, idx, entcnt - 1);
383 brt_vdev_dump(brt_vdev_t *brtvd)
387 uint64_t nblocks = BRT_RANGESIZE_TO_NBLOCKS(brtvd->bv_size);
390 (u_longlong_t)brtvd->bv_vdevid,
391 brtvd->bv_meta_dirty, brtvd->bv_entcount_dirty,
392 (u_longlong_t)brtvd->bv_size,
393 (u_longlong_t)brtvd->bv_totalcount,
396 if (brtvd->bv_totalcount > 0) {
398 for (idx = 0; idx < brtvd->bv_size; idx++) {
399 uint16_t entcnt = brt_vdev_entcount_get(brtvd, idx);
406 if (brtvd->bv_entcount_dirty) {
412 BT_TEST(brtvd->bv_bitmap, idx) ? 'x' : '.';
424 brt_vdev_t *brtvd = NULL;
428 brtvd = spa->spa_brt_vdevs[vdevid];
435 brtvd = spa->spa_brt_vdevs[vdevid];
438 return (brtvd);
442 brt_vdev_create(spa_t *spa, brt_vdev_t *brtvd, dmu_tx_t *tx)
446 ASSERT(brtvd->bv_initiated);
447 ASSERT0(brtvd->bv_mos_brtvdev);
448 ASSERT0(brtvd->bv_mos_entries);
454 VERIFY0(dnode_hold(spa->spa_meta_objset, mos_entries, brtvd,
455 &brtvd->bv_mos_entries_dnode));
456 rw_enter(&brtvd->bv_mos_entries_lock, RW_WRITER);
457 brtvd->bv_mos_entries = mos_entries;
458 rw_exit(&brtvd->bv_mos_entries_lock);
460 (u_longlong_t)brtvd->bv_mos_entries);
467 brtvd->bv_mos_brtvdev = dmu_object_alloc(spa->spa_meta_objset,
470 VERIFY(brtvd->bv_mos_brtvdev != 0);
472 (u_longlong_t)brtvd->bv_mos_brtvdev);
475 (u_longlong_t)brtvd->bv_vdevid);
477 sizeof (uint64_t), 1, &brtvd->bv_mos_brtvdev, tx));
484 brt_vdev_realloc(spa_t *spa, brt_vdev_t *brtvd)
491 ASSERT(RW_WRITE_HELD(&brtvd->bv_lock));
494 vd = vdev_lookup_top(spa, brtvd->bv_vdevid);
502 if (!brtvd->bv_initiated) {
503 ASSERT0(brtvd->bv_size);
504 ASSERT0P(brtvd->bv_entcount);
505 ASSERT0P(brtvd->bv_bitmap);
507 ASSERT(brtvd->bv_size > 0);
508 ASSERT(brtvd->bv_entcount != NULL);
509 ASSERT(brtvd->bv_bitmap != NULL);
513 * dmu_free_range(spa->spa_meta_objset, brtvd->bv_mos_brtvdev,
516 ASSERT3U(brtvd->bv_size, <=, size);
518 memcpy(entcount, brtvd->bv_entcount,
519 sizeof (entcount[0]) * MIN(size, brtvd->bv_size));
520 vmem_free(brtvd->bv_entcount,
521 sizeof (entcount[0]) * brtvd->bv_size);
522 onblocks = BRT_RANGESIZE_TO_NBLOCKS(brtvd->bv_size);
523 memcpy(bitmap, brtvd->bv_bitmap, MIN(BT_SIZEOFMAP(nblocks),
525 kmem_free(brtvd->bv_bitmap, BT_SIZEOFMAP(onblocks));
528 brtvd->bv_size = size;
529 brtvd->bv_entcount = entcount;
530 brtvd->bv_bitmap = bitmap;
531 if (!brtvd->bv_initiated) {
532 brtvd->bv_need_byteswap = FALSE;
533 brtvd->bv_initiated = TRUE;
535 (u_longlong_t)brtvd->bv_vdevid);
540 brt_vdev_load(spa_t *spa, brt_vdev_t *brtvd)
546 ASSERT(!brtvd->bv_initiated);
547 ASSERT(brtvd->bv_mos_brtvdev != 0);
549 error = dmu_bonus_hold(spa->spa_meta_objset, brtvd->bv_mos_brtvdev,
561 brt_vdev_realloc(spa, brtvd);
564 ASSERT3U(bvphys->bvp_size, <=, brtvd->bv_size);
569 error = dmu_read(spa->spa_meta_objset, brtvd->bv_mos_brtvdev, 0,
570 MIN(brtvd->bv_size, bvphys->bvp_size) * sizeof (uint16_t),
571 brtvd->bv_entcount, DMU_READ_NO_PREFETCH);
576 VERIFY0(dnode_hold(spa->spa_meta_objset, bvphys->bvp_mos_entries, brtvd,
577 &brtvd->bv_mos_entries_dnode));
578 rw_enter(&brtvd->bv_mos_entries_lock, RW_WRITER);
579 brtvd->bv_mos_entries = bvphys->bvp_mos_entries;
580 rw_exit(&brtvd->bv_mos_entries_lock);
581 brtvd->bv_need_byteswap =
583 brtvd->bv_totalcount = bvphys->bvp_totalcount;
584 brtvd->bv_usedspace = bvphys->bvp_usedspace;
585 brtvd->bv_savedspace = bvphys->bvp_savedspace;
590 (u_longlong_t)brtvd->bv_vdevid,
591 (u_longlong_t)brtvd->bv_mos_brtvdev,
592 (u_longlong_t)brtvd->bv_mos_entries);
597 brt_vdev_dealloc(brt_vdev_t *brtvd)
599 ASSERT(RW_WRITE_HELD(&brtvd->bv_lock));
600 ASSERT(brtvd->bv_initiated);
601 ASSERT0(avl_numnodes(&brtvd->bv_tree));
603 vmem_free(brtvd->bv_entcount, sizeof (uint16_t) * brtvd->bv_size);
604 brtvd->bv_entcount = NULL;
605 uint64_t nblocks = BRT_RANGESIZE_TO_NBLOCKS(brtvd->bv_size);
606 kmem_free(brtvd->bv_bitmap, BT_SIZEOFMAP(nblocks));
607 brtvd->bv_bitmap = NULL;
609 brtvd->bv_size = 0;
611 brtvd->bv_initiated = FALSE;
612 BRT_DEBUG("BRT VDEV %llu deallocated.", (u_longlong_t)brtvd->bv_vdevid);
616 brt_vdev_destroy(spa_t *spa, brt_vdev_t *brtvd, dmu_tx_t *tx)
621 ASSERT(brtvd->bv_initiated);
622 ASSERT(brtvd->bv_mos_brtvdev != 0);
623 ASSERT(brtvd->bv_mos_entries != 0);
624 ASSERT0(brtvd->bv_totalcount);
625 ASSERT0(brtvd->bv_usedspace);
626 ASSERT0(brtvd->bv_savedspace);
628 uint64_t mos_entries = brtvd->bv_mos_entries;
629 rw_enter(&brtvd->bv_mos_entries_lock, RW_WRITER);
630 brtvd->bv_mos_entries = 0;
631 rw_exit(&brtvd->bv_mos_entries_lock);
632 dnode_rele(brtvd->bv_mos_entries_dnode, brtvd);
633 brtvd->bv_mos_entries_dnode = NULL;
640 VERIFY0(dmu_object_free(spa->spa_meta_objset, brtvd->bv_mos_brtvdev,
643 (u_longlong_t)brtvd->bv_mos_brtvdev);
644 brtvd->bv_mos_brtvdev = 0;
645 brtvd->bv_entcount_dirty = FALSE;
648 (u_longlong_t)brtvd->bv_vdevid);
653 brtvd->bv_meta_dirty = FALSE;
655 rw_enter(&brtvd->bv_lock, RW_WRITER);
656 brt_vdev_dealloc(brtvd);
657 rw_exit(&brtvd->bv_lock);
685 brt_vdev_t *brtvd = kmem_zalloc(sizeof (*brtvd), KM_SLEEP);
686 rw_init(&brtvd->bv_lock, NULL, RW_DEFAULT, NULL);
687 brtvd->bv_vdevid = vdevid;
688 brtvd->bv_initiated = FALSE;
689 rw_init(&brtvd->bv_mos_entries_lock, NULL, RW_DEFAULT, NULL);
690 avl_create(&brtvd->bv_tree, brt_entry_compare,
693 avl_create(&brtvd->bv_pending_tree[i],
697 mutex_init(&brtvd->bv_pending_lock, NULL, MUTEX_DEFAULT, NULL);
698 spa->spa_brt_vdevs[vdevid] = brtvd;
707 brt_vdev_lookup(spa_t *spa, brt_vdev_t *brtvd, uint64_t offset)
710 if (idx < brtvd->bv_size) {
712 return (brt_vdev_entcount_get(brtvd, idx) > 0);
718 brt_vdev_addref(spa_t *spa, brt_vdev_t *brtvd, const brt_entry_t *bre,
723 ASSERT(brtvd->bv_initiated);
725 brtvd->bv_savedspace += dsize * count;
726 brtvd->bv_meta_dirty = TRUE;
731 brtvd->bv_usedspace += dsize;
734 if (idx >= brtvd->bv_size) {
736 rw_enter(&brtvd->bv_lock, RW_WRITER);
737 brt_vdev_realloc(spa, brtvd);
738 rw_exit(&brtvd->bv_lock);
741 ASSERT3U(idx, <, brtvd->bv_size);
743 brtvd->bv_totalcount++;
744 brt_vdev_entcount_inc(brtvd, idx);
745 brtvd->bv_entcount_dirty = TRUE;
747 BT_SET(brtvd->bv_bitmap, idx);
751 brt_vdev_decref(spa_t *spa, brt_vdev_t *brtvd, const brt_entry_t *bre,
756 ASSERT(RW_WRITE_HELD(&brtvd->bv_lock));
757 ASSERT(brtvd->bv_initiated);
759 brtvd->bv_savedspace -= dsize;
760 brtvd->bv_meta_dirty = TRUE;
765 brtvd->bv_usedspace -= dsize;
768 ASSERT3U(idx, <, brtvd->bv_size);
770 ASSERT(brtvd->bv_totalcount > 0);
771 brtvd->bv_totalcount--;
772 brt_vdev_entcount_dec(brtvd, idx);
773 brtvd->bv_entcount_dirty = TRUE;
775 BT_SET(brtvd->bv_bitmap, idx);
779 brt_vdev_sync(spa_t *spa, brt_vdev_t *brtvd, dmu_tx_t *tx)
784 ASSERT(brtvd->bv_meta_dirty);
785 ASSERT(brtvd->bv_mos_brtvdev != 0);
788 VERIFY0(dmu_bonus_hold(spa->spa_meta_objset, brtvd->bv_mos_brtvdev,
791 if (brtvd->bv_entcount_dirty) {
793 * TODO: Walk brtvd->bv_bitmap and write only the dirty blocks.
795 dmu_write(spa->spa_meta_objset, brtvd->bv_mos_brtvdev, 0,
796 brtvd->bv_size * sizeof (brtvd->bv_entcount[0]),
797 brtvd->bv_entcount, tx);
798 uint64_t nblocks = BRT_RANGESIZE_TO_NBLOCKS(brtvd->bv_size);
799 memset(brtvd->bv_bitmap, 0, BT_SIZEOFMAP(nblocks));
800 brtvd->bv_entcount_dirty = FALSE;
805 bvphys->bvp_mos_entries = brtvd->bv_mos_entries;
806 bvphys->bvp_size = brtvd->bv_size;
807 if (brtvd->bv_need_byteswap) {
812 bvphys->bvp_totalcount = brtvd->bv_totalcount;
814 bvphys->bvp_usedspace = brtvd->bv_usedspace;
815 bvphys->bvp_savedspace = brtvd->bv_savedspace;
818 brtvd->bv_meta_dirty = FALSE;
827 brt_vdev_t *brtvd = spa->spa_brt_vdevs[vdevid];
828 rw_enter(&brtvd->bv_lock, RW_WRITER);
829 if (brtvd->bv_initiated)
830 brt_vdev_dealloc(brtvd);
831 rw_exit(&brtvd->bv_lock);
832 rw_destroy(&brtvd->bv_lock);
833 if (brtvd->bv_mos_entries != 0)
834 dnode_rele(brtvd->bv_mos_entries_dnode, brtvd);
835 rw_destroy(&brtvd->bv_mos_entries_lock);
836 avl_destroy(&brtvd->bv_tree);
838 avl_destroy(&brtvd->bv_pending_tree[i]);
839 mutex_destroy(&brtvd->bv_pending_lock);
840 kmem_free(brtvd, sizeof (*brtvd));
858 brt_entry_lookup(brt_vdev_t *brtvd, brt_entry_t *bre)
862 if (brtvd->bv_mos_entries == 0)
865 return (zap_lookup_uint64_by_dnode(brtvd->bv_mos_entries_dnode,
882 brt_vdev_t *brtvd = brt_vdev(spa, vdevid, B_FALSE);
883 if (brtvd == NULL || !brtvd->bv_initiated)
893 return (brt_vdev_lookup(spa, brtvd, off));
1044 brt_vdev_t *brtvd = brt_vdev(spa, vdevid, B_FALSE);
1045 ASSERT(brtvd != NULL);
1047 rw_enter(&brtvd->bv_lock, RW_WRITER);
1048 ASSERT(brtvd->bv_initiated);
1049 bre = avl_find(&brtvd->bv_tree, &bre_search, NULL);
1056 rw_exit(&brtvd->bv_lock);
1058 error = brt_entry_lookup(brtvd, &bre_search);
1066 rw_enter(&brtvd->bv_lock, RW_WRITER);
1067 racebre = avl_find(&brtvd->bv_tree, &bre_search, &where);
1080 avl_insert(&brtvd->bv_tree, bre, where);
1084 rw_exit(&brtvd->bv_lock);
1096 brt_vdev_decref(spa, brtvd, bre, bp_get_dsize_sync(spa, bp));
1098 rw_exit(&brtvd->bv_lock);
1112 brt_vdev_t *brtvd = brt_vdev(spa, vdevid, B_FALSE);
1113 ASSERT(brtvd != NULL);
1115 rw_enter(&brtvd->bv_lock, RW_READER);
1116 ASSERT(brtvd->bv_initiated);
1117 bre = avl_find(&brtvd->bv_tree, &bre_search, NULL);
1119 rw_exit(&brtvd->bv_lock);
1120 error = brt_entry_lookup(brtvd, &bre_search);
1129 rw_exit(&brtvd->bv_lock);
1136 brt_prefetch(brt_vdev_t *brtvd, const blkptr_t *bp)
1138 if (!brt_zap_prefetch || brtvd->bv_mos_entries == 0)
1142 rw_enter(&brtvd->bv_mos_entries_lock, RW_READER);
1143 if (brtvd->bv_mos_entries != 0) {
1144 (void) zap_prefetch_uint64_by_dnode(brtvd->bv_mos_entries_dnode,
1147 rw_exit(&brtvd->bv_mos_entries_lock);
1171 brt_vdev_t *brtvd = brt_vdev(spa, vdevid, B_TRUE);
1172 avl_tree_t *pending_tree = &brtvd->bv_pending_tree[txg & TXG_MASK];
1179 mutex_enter(&brtvd->bv_pending_lock);
1187 mutex_exit(&brtvd->bv_pending_lock);
1197 brt_prefetch(brtvd, bp);
1211 brt_vdev_t *brtvd = brt_vdev(spa, vdevid, B_FALSE);
1212 ASSERT(brtvd != NULL);
1213 avl_tree_t *pending_tree = &brtvd->bv_pending_tree[txg & TXG_MASK];
1217 mutex_enter(&brtvd->bv_pending_lock);
1226 mutex_exit(&brtvd->bv_pending_lock);
1233 brt_pending_apply_vdev(spa_t *spa, brt_vdev_t *brtvd, uint64_t txg)
1241 ASSERT(avl_is_empty(&brtvd->bv_tree));
1242 avl_swap(&brtvd->bv_tree, &brtvd->bv_pending_tree[txg & TXG_MASK]);
1244 for (bre = avl_first(&brtvd->bv_tree); bre; bre = nbre) {
1245 nbre = AVL_NEXT(&brtvd->bv_tree, bre);
1259 avl_remove(&brtvd->bv_tree, bre);
1270 if (brtvd->bv_mos_entries != 0 &&
1271 brt_vdev_lookup(spa, brtvd, off)) {
1273 brtvd->bv_mos_entries_dnode, &off,
1289 if (avl_is_empty(&brtvd->bv_tree))
1292 if (!brtvd->bv_initiated) {
1293 rw_enter(&brtvd->bv_lock, RW_WRITER);
1294 brt_vdev_realloc(spa, brtvd);
1295 rw_exit(&brtvd->bv_lock);
1303 for (bre = avl_first(&brtvd->bv_tree); bre;
1304 bre = AVL_NEXT(&brtvd->bv_tree, bre)) {
1305 brt_vdev_addref(spa, brtvd, bre,
1317 brt_vdev_t *brtvd = spa->spa_brt_vdevs[vdevid];
1320 brt_pending_apply_vdev(spa, brtvd, txg);
1352 brt_vdev_t *brtvd = spa->spa_brt_vdevs[vdevid];
1355 if (!brtvd->bv_meta_dirty) {
1356 ASSERT(!brtvd->bv_entcount_dirty);
1357 ASSERT0(avl_numnodes(&brtvd->bv_tree));
1362 ASSERT(!brtvd->bv_entcount_dirty ||
1363 avl_numnodes(&brtvd->bv_tree) != 0);
1365 if (brtvd->bv_mos_brtvdev == 0)
1366 brt_vdev_create(spa, brtvd, tx);
1369 while ((bre = avl_destroy_nodes(&brtvd->bv_tree, &c)) != NULL) {
1370 brt_sync_entry(brtvd->bv_mos_entries_dnode, bre, tx);
1376 brt_vdev_dump(brtvd);
1378 if (brtvd->bv_totalcount == 0)
1379 brt_vdev_destroy(spa, brtvd, tx);
1381 brt_vdev_sync(spa, brtvd, tx);
1454 brt_vdev_t *brtvd = spa->spa_brt_vdevs[vdevid];
1455 rw_enter(&brtvd->bv_lock, RW_WRITER);
1456 brtvd->bv_mos_brtvdev = mos_brtvdev;
1457 error = brt_vdev_load(spa, brtvd);
1458 rw_exit(&brtvd->bv_lock);