Skip to content

Commit

Permalink
drbd: Iterate over all overlapping intervals in a tree
Browse files Browse the repository at this point in the history
Add a macro and helper function for doing that.

Signed-off-by: Philipp Reisner <[email protected]>
Signed-off-by: Lars Ellenberg <[email protected]>
  • Loading branch information
andreas-gruenbacher authored and Philipp-Reisner committed Oct 14, 2011
1 parent fcefa62 commit d0e22a2
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 4 deletions.
18 changes: 18 additions & 0 deletions drivers/block/drbd/drbd_interval.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,3 +157,21 @@ drbd_find_overlap(struct rb_root *root, sector_t sector, unsigned int size)
}
return overlap;
}

struct drbd_interval *
drbd_next_overlap(struct drbd_interval *i, sector_t sector, unsigned int size)
{
sector_t end = sector + (size >> 9);
struct rb_node *node;

for (;;) {
node = rb_next(&i->rb);
if (!node)
return NULL;
i = rb_entry(node, struct drbd_interval, rb);
if (i->sector >= end)
return NULL;
if (sector < i->sector + (i->size >> 9))
return i;
}
}
16 changes: 12 additions & 4 deletions drivers/block/drbd/drbd_interval.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,18 @@ static inline bool drbd_interval_empty(struct drbd_interval *i)
return RB_EMPTY_NODE(&i->rb);
}

bool drbd_insert_interval(struct rb_root *, struct drbd_interval *);
bool drbd_contains_interval(struct rb_root *, sector_t, struct drbd_interval *);
void drbd_remove_interval(struct rb_root *, struct drbd_interval *);
struct drbd_interval *drbd_find_overlap(struct rb_root *, sector_t,
extern bool drbd_insert_interval(struct rb_root *, struct drbd_interval *);
extern bool drbd_contains_interval(struct rb_root *, sector_t,
struct drbd_interval *);
extern void drbd_remove_interval(struct rb_root *, struct drbd_interval *);
extern struct drbd_interval *drbd_find_overlap(struct rb_root *, sector_t,
unsigned int);
extern struct drbd_interval *drbd_next_overlap(struct drbd_interval *, sector_t,
unsigned int);

#define drbd_for_each_overlap(i, root, sector, size) \
for (i = drbd_find_overlap(root, sector, size); \
i; \
i = drbd_next_overlap(i, sector, size))

#endif /* __DRBD_INTERVAL_H */

0 comments on commit d0e22a2

Please sign in to comment.