^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef __DRBD_INTERVAL_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define __DRBD_INTERVAL_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/rbtree.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) struct drbd_interval {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) struct rb_node rb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) sector_t sector; /* start sector of the interval */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) unsigned int size; /* size in bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) sector_t end; /* highest interval end in subtree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) unsigned int local:1 /* local or remote request? */;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) unsigned int waiting:1; /* someone is waiting for completion */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) unsigned int completed:1; /* this has been completed already;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * ignore for conflict detection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) static inline void drbd_clear_interval(struct drbd_interval *i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) RB_CLEAR_NODE(&i->rb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) static inline bool drbd_interval_empty(struct drbd_interval *i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) return RB_EMPTY_NODE(&i->rb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) extern bool drbd_insert_interval(struct rb_root *, struct drbd_interval *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) extern bool drbd_contains_interval(struct rb_root *, sector_t,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) struct drbd_interval *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) extern void drbd_remove_interval(struct rb_root *, struct drbd_interval *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) extern struct drbd_interval *drbd_find_overlap(struct rb_root *, sector_t,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) unsigned int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) extern struct drbd_interval *drbd_next_overlap(struct drbd_interval *, sector_t,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) unsigned int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define drbd_for_each_overlap(i, root, sector, size) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) for (i = drbd_find_overlap(root, sector, size); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) i; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) i = drbd_next_overlap(i, sector, size))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #endif /* __DRBD_INTERVAL_H */