]>
Commit | Line | Data |
---|---|---|
602cbe91 DS |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | ||
3 | #ifndef BTRFS_MISC_H | |
4 | #define BTRFS_MISC_H | |
5 | ||
6 | #include <linux/sched.h> | |
7 | #include <linux/wait.h> | |
784352fe | 8 | #include <asm/div64.h> |
e9a28dc5 | 9 | #include <linux/rbtree.h> |
602cbe91 DS |
10 | |
11 | #define in_range(b, first, len) ((b) >= (first) && (b) < (first) + (len)) | |
12 | ||
13 | static inline void cond_wake_up(struct wait_queue_head *wq) | |
14 | { | |
15 | /* | |
16 | * This implies a full smp_mb barrier, see comments for | |
17 | * waitqueue_active why. | |
18 | */ | |
19 | if (wq_has_sleeper(wq)) | |
20 | wake_up(wq); | |
21 | } | |
22 | ||
23 | static inline void cond_wake_up_nomb(struct wait_queue_head *wq) | |
24 | { | |
25 | /* | |
26 | * Special case for conditional wakeup where the barrier required for | |
27 | * waitqueue_active is implied by some of the preceding code. Eg. one | |
28 | * of such atomic operations (atomic_dec_and_return, ...), or a | |
29 | * unlock/lock sequence, etc. | |
30 | */ | |
31 | if (waitqueue_active(wq)) | |
32 | wake_up(wq); | |
33 | } | |
34 | ||
784352fe DS |
35 | static inline u64 div_factor(u64 num, int factor) |
36 | { | |
37 | if (factor == 10) | |
38 | return num; | |
39 | num *= factor; | |
40 | return div_u64(num, 10); | |
41 | } | |
42 | ||
43 | static inline u64 div_factor_fine(u64 num, int factor) | |
44 | { | |
45 | if (factor == 100) | |
46 | return num; | |
47 | num *= factor; | |
48 | return div_u64(num, 100); | |
49 | } | |
50 | ||
79c8264e DS |
51 | /* Copy of is_power_of_two that is 64bit safe */ |
52 | static inline bool is_power_of_two_u64(u64 n) | |
53 | { | |
54 | return n != 0 && (n & (n - 1)) == 0; | |
55 | } | |
56 | ||
57 | static inline bool has_single_bit_set(u64 n) | |
58 | { | |
59 | return is_power_of_two_u64(n); | |
60 | } | |
61 | ||
e9a28dc5 QW |
62 | /* |
63 | * Simple bytenr based rb_tree relate structures | |
64 | * | |
65 | * Any structure wants to use bytenr as single search index should have their | |
66 | * structure start with these members. | |
67 | */ | |
68 | struct rb_simple_node { | |
69 | struct rb_node rb_node; | |
70 | u64 bytenr; | |
71 | }; | |
72 | ||
73 | static inline struct rb_node *rb_simple_search(struct rb_root *root, u64 bytenr) | |
74 | { | |
75 | struct rb_node *node = root->rb_node; | |
76 | struct rb_simple_node *entry; | |
77 | ||
78 | while (node) { | |
79 | entry = rb_entry(node, struct rb_simple_node, rb_node); | |
80 | ||
81 | if (bytenr < entry->bytenr) | |
82 | node = node->rb_left; | |
83 | else if (bytenr > entry->bytenr) | |
84 | node = node->rb_right; | |
85 | else | |
86 | return node; | |
87 | } | |
88 | return NULL; | |
89 | } | |
90 | ||
91 | static inline struct rb_node *rb_simple_insert(struct rb_root *root, u64 bytenr, | |
92 | struct rb_node *node) | |
93 | { | |
94 | struct rb_node **p = &root->rb_node; | |
95 | struct rb_node *parent = NULL; | |
96 | struct rb_simple_node *entry; | |
97 | ||
98 | while (*p) { | |
99 | parent = *p; | |
100 | entry = rb_entry(parent, struct rb_simple_node, rb_node); | |
101 | ||
102 | if (bytenr < entry->bytenr) | |
103 | p = &(*p)->rb_left; | |
104 | else if (bytenr > entry->bytenr) | |
105 | p = &(*p)->rb_right; | |
106 | else | |
107 | return parent; | |
108 | } | |
109 | ||
110 | rb_link_node(node, parent, p); | |
111 | rb_insert_color(node, root); | |
112 | return NULL; | |
113 | } | |
114 | ||
602cbe91 | 115 | #endif |