From abd49e4ae7df04f30760dada8e457ae1a3e5c3d9 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Thu, 17 Feb 2011 18:11:24 +0100 Subject: [PATCH] --- yaml --- r: 345817 b: refs/heads/master c: d0e22a260c5142171c730436664febb045b9f0f0 h: refs/heads/master i: 345815: 0fc23e9e896dcfd88ddd0edd3ae7cf76f3287f27 v: v3 --- [refs] | 2 +- trunk/drivers/block/drbd/drbd_interval.c | 18 ++++++++++++++++++ trunk/drivers/block/drbd/drbd_interval.h | 16 ++++++++++++---- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 0c08dbfeccd8..d2ad7e2e18cb 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: fcefa62e4c26e70c70b9e8252a4bc9b9031a4182 +refs/heads/master: d0e22a260c5142171c730436664febb045b9f0f0 diff --git a/trunk/drivers/block/drbd/drbd_interval.c b/trunk/drivers/block/drbd/drbd_interval.c index 14dbe2dd2d33..0e53f102e68a 100644 --- a/trunk/drivers/block/drbd/drbd_interval.c +++ b/trunk/drivers/block/drbd/drbd_interval.c @@ -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; + } +} diff --git a/trunk/drivers/block/drbd/drbd_interval.h b/trunk/drivers/block/drbd/drbd_interval.h index 4010ad923948..f38fcb00c10d 100644 --- a/trunk/drivers/block/drbd/drbd_interval.h +++ b/trunk/drivers/block/drbd/drbd_interval.h @@ -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 */