// SPDX-License-Identifier: GPL-2.0-only #include <asm/bug.h> #include <linux/rbtree_augmented.h> #include "drbd_interval.h" /* * interval_end - return end of @node */ static inline sector_t interval_end(struct rb_node *node) { … } #define NODE_END(node) … RB_DECLARE_CALLBACKS_MAX(static, augment_callbacks, struct drbd_interval, rb, sector_t, end, NODE_END); /* * drbd_insert_interval - insert a new interval into a tree */ bool drbd_insert_interval(struct rb_root *root, struct drbd_interval *this) { … } /** * drbd_contains_interval - check if a tree contains a given interval * @root: red black tree root * @sector: start sector of @interval * @interval: may be an invalid pointer * * Returns if the tree contains the node @interval with start sector @start. * Does not dereference @interval until @interval is known to be a valid object * in @tree. Returns %false if @interval is in the tree but with a different * sector number. */ bool drbd_contains_interval(struct rb_root *root, sector_t sector, struct drbd_interval *interval) { … } /* * drbd_remove_interval - remove an interval from a tree */ void drbd_remove_interval(struct rb_root *root, struct drbd_interval *this) { … } /** * drbd_find_overlap - search for an interval overlapping with [sector, sector + size) * @root: red black tree root * @sector: start sector * @size: size, aligned to 512 bytes * * Returns an interval overlapping with [sector, sector + size), or NULL if * there is none. When there is more than one overlapping interval in the * tree, the interval with the lowest start sector is returned, and all other * overlapping intervals will be on the right side of the tree, reachable with * rb_next(). */ struct drbd_interval * drbd_find_overlap(struct rb_root *root, sector_t sector, unsigned int size) { … } struct drbd_interval * drbd_next_overlap(struct drbd_interval *i, sector_t sector, unsigned int size) { … }