Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drbd: Iterate over all overlapping intervals in a tree

Add a macro and helper function for doing that.

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>

authored by

Andreas Gruenbacher and committed by
Philipp Reisner
d0e22a26 fcefa62e

+30 -4
+18
drivers/block/drbd/drbd_interval.c
··· 157 157 } 158 158 return overlap; 159 159 } 160 + 161 + struct drbd_interval * 162 + drbd_next_overlap(struct drbd_interval *i, sector_t sector, unsigned int size) 163 + { 164 + sector_t end = sector + (size >> 9); 165 + struct rb_node *node; 166 + 167 + for (;;) { 168 + node = rb_next(&i->rb); 169 + if (!node) 170 + return NULL; 171 + i = rb_entry(node, struct drbd_interval, rb); 172 + if (i->sector >= end) 173 + return NULL; 174 + if (sector < i->sector + (i->size >> 9)) 175 + return i; 176 + } 177 + }
+12 -4
drivers/block/drbd/drbd_interval.h
··· 23 23 return RB_EMPTY_NODE(&i->rb); 24 24 } 25 25 26 - bool drbd_insert_interval(struct rb_root *, struct drbd_interval *); 27 - bool drbd_contains_interval(struct rb_root *, sector_t, struct drbd_interval *); 28 - void drbd_remove_interval(struct rb_root *, struct drbd_interval *); 29 - struct drbd_interval *drbd_find_overlap(struct rb_root *, sector_t, 26 + extern bool drbd_insert_interval(struct rb_root *, struct drbd_interval *); 27 + extern bool drbd_contains_interval(struct rb_root *, sector_t, 28 + struct drbd_interval *); 29 + extern void drbd_remove_interval(struct rb_root *, struct drbd_interval *); 30 + extern struct drbd_interval *drbd_find_overlap(struct rb_root *, sector_t, 30 31 unsigned int); 32 + extern struct drbd_interval *drbd_next_overlap(struct drbd_interval *, sector_t, 33 + unsigned int); 34 + 35 + #define drbd_for_each_overlap(i, root, sector, size) \ 36 + for (i = drbd_find_overlap(root, sector, size); \ 37 + i; \ 38 + i = drbd_next_overlap(i, sector, size)) 31 39 32 40 #endif /* __DRBD_INTERVAL_H */