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