301 range_seg_t rsearch;
302 uint64_t end = start + size;
303
304 VERIFY(size != 0);
305
306 rsearch.rs_start = start;
307 rsearch.rs_end = end;
308 return (avl_find(&rt->rt_root, &rsearch, NULL));
309 }
310
311 static range_seg_t *
312 range_tree_find(range_tree_t *rt, uint64_t start, uint64_t size)
313 {
314 range_seg_t *rs = range_tree_find_impl(rt, start, size);
315 if (rs != NULL && rs->rs_start <= start && rs->rs_end >= start + size)
316 return (rs);
317 return (NULL);
318 }
319
320 void
321 range_tree_verify(range_tree_t *rt, uint64_t off, uint64_t size)
322 {
323 range_seg_t *rs;
324
325 rs = range_tree_find(rt, off, size);
326 if (rs != NULL)
327 panic("freeing free block; rs=%p", (void *)rs);
328 }
329
330 boolean_t
331 range_tree_contains(range_tree_t *rt, uint64_t start, uint64_t size)
332 {
333 return (range_tree_find(rt, start, size) != NULL);
334 }
335
336 /*
337 * Ensure that this range is not in the tree, regardless of whether
338 * it is currently in the tree.
339 */
340 void
341 range_tree_clear(range_tree_t *rt, uint64_t start, uint64_t size)
342 {
343 range_seg_t *rs;
344
345 if (size == 0)
346 return;
347
|
301 range_seg_t rsearch;
302 uint64_t end = start + size;
303
304 VERIFY(size != 0);
305
306 rsearch.rs_start = start;
307 rsearch.rs_end = end;
308 return (avl_find(&rt->rt_root, &rsearch, NULL));
309 }
310
311 static range_seg_t *
312 range_tree_find(range_tree_t *rt, uint64_t start, uint64_t size)
313 {
314 range_seg_t *rs = range_tree_find_impl(rt, start, size);
315 if (rs != NULL && rs->rs_start <= start && rs->rs_end >= start + size)
316 return (rs);
317 return (NULL);
318 }
319
320 void
321 range_tree_verify_not_present(range_tree_t *rt, uint64_t off, uint64_t size)
322 {
323 range_seg_t *rs = range_tree_find(rt, off, size);
324 if (rs != NULL)
325 panic("segment already in tree; rs=%p", (void *)rs);
326 }
327
328 boolean_t
329 range_tree_contains(range_tree_t *rt, uint64_t start, uint64_t size)
330 {
331 return (range_tree_find(rt, start, size) != NULL);
332 }
333
334 /*
335 * Ensure that this range is not in the tree, regardless of whether
336 * it is currently in the tree.
337 */
338 void
339 range_tree_clear(range_tree_t *rt, uint64_t start, uint64_t size)
340 {
341 range_seg_t *rs;
342
343 if (size == 0)
344 return;
345
|