Print this page
10592 misc. metaslab and vdev related ZoL bug fixes
Portions contributed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed by: Giuseppe Di Natale <guss80@gmail.com>
Reviewed by: George Melikov <mail@gmelikov.ru>
Reviewed by: Paul Dagnelie <pcd@delphix.com>
Reviewed by: Matt Ahrens <mahrens@delphix.com>
Reviewed by: Pavel Zakharov <pavel.zakharov@delphix.com>
Reviewed by: Tony Hutter <hutter2@llnl.gov>
Reviewed by: Kody Kantor <kody.kantor@joyent.com>
Approved by: Dan McDonald <danmcd@joyent.com>


  64         avl_node_t      rs_pp_node;     /* AVL picker-private node */
  65         uint64_t        rs_start;       /* starting offset of this segment */
  66         uint64_t        rs_end;         /* ending offset (non-inclusive) */
  67 } range_seg_t;
  68 
  69 struct range_tree_ops {
  70         void    (*rtop_create)(range_tree_t *rt, void *arg);
  71         void    (*rtop_destroy)(range_tree_t *rt, void *arg);
  72         void    (*rtop_add)(range_tree_t *rt, range_seg_t *rs, void *arg);
  73         void    (*rtop_remove)(range_tree_t *rt, range_seg_t *rs, void *arg);
  74         void    (*rtop_vacate)(range_tree_t *rt, void *arg);
  75 };
  76 
  77 typedef void range_tree_func_t(void *arg, uint64_t start, uint64_t size);
  78 
  79 void range_tree_init(void);
  80 void range_tree_fini(void);
  81 range_tree_t *range_tree_create(range_tree_ops_t *ops, void *arg);
  82 void range_tree_destroy(range_tree_t *rt);
  83 boolean_t range_tree_contains(range_tree_t *rt, uint64_t start, uint64_t size);


  84 uint64_t range_tree_space(range_tree_t *rt);
  85 boolean_t range_tree_is_empty(range_tree_t *rt);
  86 void range_tree_verify(range_tree_t *rt, uint64_t start, uint64_t size);
  87 void range_tree_swap(range_tree_t **rtsrc, range_tree_t **rtdst);
  88 void range_tree_stat_verify(range_tree_t *rt);
  89 uint64_t range_tree_min(range_tree_t *rt);
  90 uint64_t range_tree_max(range_tree_t *rt);
  91 uint64_t range_tree_span(range_tree_t *rt);
  92 
  93 void range_tree_add(void *arg, uint64_t start, uint64_t size);
  94 void range_tree_remove(void *arg, uint64_t start, uint64_t size);
  95 void range_tree_clear(range_tree_t *rt, uint64_t start, uint64_t size);
  96 
  97 void range_tree_vacate(range_tree_t *rt, range_tree_func_t *func, void *arg);
  98 void range_tree_walk(range_tree_t *rt, range_tree_func_t *func, void *arg);
  99 
 100 #ifdef  __cplusplus
 101 }
 102 #endif
 103 
 104 #endif  /* _SYS_RANGE_TREE_H */


  64         avl_node_t      rs_pp_node;     /* AVL picker-private node */
  65         uint64_t        rs_start;       /* starting offset of this segment */
  66         uint64_t        rs_end;         /* ending offset (non-inclusive) */
  67 } range_seg_t;
  68 
  69 struct range_tree_ops {
  70         void    (*rtop_create)(range_tree_t *rt, void *arg);
  71         void    (*rtop_destroy)(range_tree_t *rt, void *arg);
  72         void    (*rtop_add)(range_tree_t *rt, range_seg_t *rs, void *arg);
  73         void    (*rtop_remove)(range_tree_t *rt, range_seg_t *rs, void *arg);
  74         void    (*rtop_vacate)(range_tree_t *rt, void *arg);
  75 };
  76 
  77 typedef void range_tree_func_t(void *arg, uint64_t start, uint64_t size);
  78 
  79 void range_tree_init(void);
  80 void range_tree_fini(void);
  81 range_tree_t *range_tree_create(range_tree_ops_t *ops, void *arg);
  82 void range_tree_destroy(range_tree_t *rt);
  83 boolean_t range_tree_contains(range_tree_t *rt, uint64_t start, uint64_t size);
  84 void range_tree_verify_not_present(range_tree_t *rt,
  85     uint64_t start, uint64_t size);
  86 uint64_t range_tree_space(range_tree_t *rt);
  87 boolean_t range_tree_is_empty(range_tree_t *rt);

  88 void range_tree_swap(range_tree_t **rtsrc, range_tree_t **rtdst);
  89 void range_tree_stat_verify(range_tree_t *rt);
  90 uint64_t range_tree_min(range_tree_t *rt);
  91 uint64_t range_tree_max(range_tree_t *rt);
  92 uint64_t range_tree_span(range_tree_t *rt);
  93 
  94 void range_tree_add(void *arg, uint64_t start, uint64_t size);
  95 void range_tree_remove(void *arg, uint64_t start, uint64_t size);
  96 void range_tree_clear(range_tree_t *rt, uint64_t start, uint64_t size);
  97 
  98 void range_tree_vacate(range_tree_t *rt, range_tree_func_t *func, void *arg);
  99 void range_tree_walk(range_tree_t *rt, range_tree_func_t *func, void *arg);
 100 
 101 #ifdef  __cplusplus
 102 }
 103 #endif
 104 
 105 #endif  /* _SYS_RANGE_TREE_H */