100
101 avl_add(t, sr);
102 }
103
104 void
105 space_reftree_add_seg(avl_tree_t *t, uint64_t start, uint64_t end,
106 int64_t refcnt)
107 {
108 space_reftree_add_node(t, start, refcnt);
109 space_reftree_add_node(t, end, -refcnt);
110 }
111
112 /*
113 * Convert (or add) a range tree into a reference tree.
114 */
115 void
116 space_reftree_add_map(avl_tree_t *t, range_tree_t *rt, int64_t refcnt)
117 {
118 range_seg_t *rs;
119
120 for (rs = avl_first(&rt->rt_root); rs; rs = AVL_NEXT(&rt->rt_root, rs))
121 space_reftree_add_seg(t, rs->rs_start, rs->rs_end, refcnt);
122 }
123
124 /*
125 * Convert a reference tree into a range tree. The range tree will contain
126 * all members of the reference tree for which refcnt >= minref.
127 */
128 void
129 space_reftree_generate_map(avl_tree_t *t, range_tree_t *rt, int64_t minref)
130 {
131 uint64_t start = -1ULL;
132 int64_t refcnt = 0;
133 space_ref_t *sr;
134
135 range_tree_vacate(rt, NULL, NULL);
136
137 for (sr = avl_first(t); sr != NULL; sr = AVL_NEXT(t, sr)) {
138 refcnt += sr->sr_refcnt;
139 if (refcnt >= minref) {
140 if (start == -1ULL) {
141 start = sr->sr_offset;
142 }
143 } else {
144 if (start != -1ULL) {
145 uint64_t end = sr->sr_offset;
146 ASSERT(start <= end);
147 if (end > start)
148 range_tree_add(rt, start, end - start);
149 start = -1ULL;
150 }
151 }
152 }
153 ASSERT(refcnt == 0);
154 ASSERT(start == -1ULL);
|
100
101 avl_add(t, sr);
102 }
103
104 void
105 space_reftree_add_seg(avl_tree_t *t, uint64_t start, uint64_t end,
106 int64_t refcnt)
107 {
108 space_reftree_add_node(t, start, refcnt);
109 space_reftree_add_node(t, end, -refcnt);
110 }
111
112 /*
113 * Convert (or add) a range tree into a reference tree.
114 */
115 void
116 space_reftree_add_map(avl_tree_t *t, range_tree_t *rt, int64_t refcnt)
117 {
118 range_seg_t *rs;
119
120 ASSERT(MUTEX_HELD(rt->rt_lock));
121
122 for (rs = avl_first(&rt->rt_root); rs; rs = AVL_NEXT(&rt->rt_root, rs))
123 space_reftree_add_seg(t, rs->rs_start, rs->rs_end, refcnt);
124 }
125
126 /*
127 * Convert a reference tree into a range tree. The range tree will contain
128 * all members of the reference tree for which refcnt >= minref.
129 */
130 void
131 space_reftree_generate_map(avl_tree_t *t, range_tree_t *rt, int64_t minref)
132 {
133 uint64_t start = -1ULL;
134 int64_t refcnt = 0;
135 space_ref_t *sr;
136
137 ASSERT(MUTEX_HELD(rt->rt_lock));
138
139 range_tree_vacate(rt, NULL, NULL);
140
141 for (sr = avl_first(t); sr != NULL; sr = AVL_NEXT(t, sr)) {
142 refcnt += sr->sr_refcnt;
143 if (refcnt >= minref) {
144 if (start == -1ULL) {
145 start = sr->sr_offset;
146 }
147 } else {
148 if (start != -1ULL) {
149 uint64_t end = sr->sr_offset;
150 ASSERT(start <= end);
151 if (end > start)
152 range_tree_add(rt, start, end - start);
153 start = -1ULL;
154 }
155 }
156 }
157 ASSERT(refcnt == 0);
158 ASSERT(start == -1ULL);
|