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