162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci#ifndef __DRBD_INTERVAL_H
362306a36Sopenharmony_ci#define __DRBD_INTERVAL_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/types.h>
662306a36Sopenharmony_ci#include <linux/rbtree.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_cistruct drbd_interval {
962306a36Sopenharmony_ci	struct rb_node rb;
1062306a36Sopenharmony_ci	sector_t sector;		/* start sector of the interval */
1162306a36Sopenharmony_ci	unsigned int size;		/* size in bytes */
1262306a36Sopenharmony_ci	sector_t end;			/* highest interval end in subtree */
1362306a36Sopenharmony_ci	unsigned int local:1		/* local or remote request? */;
1462306a36Sopenharmony_ci	unsigned int waiting:1;		/* someone is waiting for completion */
1562306a36Sopenharmony_ci	unsigned int completed:1;	/* this has been completed already;
1662306a36Sopenharmony_ci					 * ignore for conflict detection */
1762306a36Sopenharmony_ci};
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic inline void drbd_clear_interval(struct drbd_interval *i)
2062306a36Sopenharmony_ci{
2162306a36Sopenharmony_ci	RB_CLEAR_NODE(&i->rb);
2262306a36Sopenharmony_ci}
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistatic inline bool drbd_interval_empty(struct drbd_interval *i)
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci	return RB_EMPTY_NODE(&i->rb);
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ciextern bool drbd_insert_interval(struct rb_root *, struct drbd_interval *);
3062306a36Sopenharmony_ciextern bool drbd_contains_interval(struct rb_root *, sector_t,
3162306a36Sopenharmony_ci				   struct drbd_interval *);
3262306a36Sopenharmony_ciextern void drbd_remove_interval(struct rb_root *, struct drbd_interval *);
3362306a36Sopenharmony_ciextern struct drbd_interval *drbd_find_overlap(struct rb_root *, sector_t,
3462306a36Sopenharmony_ci					unsigned int);
3562306a36Sopenharmony_ciextern struct drbd_interval *drbd_next_overlap(struct drbd_interval *, sector_t,
3662306a36Sopenharmony_ci					unsigned int);
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#define drbd_for_each_overlap(i, root, sector, size)		\
3962306a36Sopenharmony_ci	for (i = drbd_find_overlap(root, sector, size);		\
4062306a36Sopenharmony_ci	     i;							\
4162306a36Sopenharmony_ci	     i = drbd_next_overlap(i, sector, size))
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#endif  /* __DRBD_INTERVAL_H */
44