libceph: make DEFINE_RB_* helpers more general
Initially for ceph_pg_mapping, ceph_spg_mapping and ceph_hobject_id, compared with ceph_pg_compare(), ceph_spg_compare() and hoid_compare() respectively. Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
df28152d53
commit
76f827a7b1
|
@ -184,10 +184,11 @@ static inline int calc_pages_for(u64 off, u64 len)
|
||||||
(off >> PAGE_SHIFT);
|
(off >> PAGE_SHIFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
#define RB_BYVAL(a) (a)
|
||||||
* These are not meant to be generic - an integer key is assumed.
|
#define RB_BYPTR(a) (&(a))
|
||||||
*/
|
#define RB_CMP3WAY(a, b) ((a) < (b) ? -1 : (a) > (b))
|
||||||
#define DEFINE_RB_INSDEL_FUNCS(name, type, keyfld, nodefld) \
|
|
||||||
|
#define DEFINE_RB_INSDEL_FUNCS2(name, type, keyfld, cmpexp, keyexp, nodefld) \
|
||||||
static void insert_##name(struct rb_root *root, type *t) \
|
static void insert_##name(struct rb_root *root, type *t) \
|
||||||
{ \
|
{ \
|
||||||
struct rb_node **n = &root->rb_node; \
|
struct rb_node **n = &root->rb_node; \
|
||||||
|
@ -197,11 +198,13 @@ static void insert_##name(struct rb_root *root, type *t) \
|
||||||
\
|
\
|
||||||
while (*n) { \
|
while (*n) { \
|
||||||
type *cur = rb_entry(*n, type, nodefld); \
|
type *cur = rb_entry(*n, type, nodefld); \
|
||||||
|
int cmp; \
|
||||||
\
|
\
|
||||||
parent = *n; \
|
parent = *n; \
|
||||||
if (t->keyfld < cur->keyfld) \
|
cmp = cmpexp(keyexp(t->keyfld), keyexp(cur->keyfld)); \
|
||||||
|
if (cmp < 0) \
|
||||||
n = &(*n)->rb_left; \
|
n = &(*n)->rb_left; \
|
||||||
else if (t->keyfld > cur->keyfld) \
|
else if (cmp > 0) \
|
||||||
n = &(*n)->rb_right; \
|
n = &(*n)->rb_right; \
|
||||||
else \
|
else \
|
||||||
BUG(); \
|
BUG(); \
|
||||||
|
@ -217,19 +220,24 @@ static void erase_##name(struct rb_root *root, type *t) \
|
||||||
RB_CLEAR_NODE(&t->nodefld); \
|
RB_CLEAR_NODE(&t->nodefld); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DEFINE_RB_LOOKUP_FUNC(name, type, keyfld, nodefld) \
|
/*
|
||||||
extern type __lookup_##name##_key; \
|
* @lookup_param_type is a parameter and not constructed from (@type,
|
||||||
static type *lookup_##name(struct rb_root *root, \
|
* @keyfld) with typeof() because adding const is too unwieldy.
|
||||||
typeof(__lookup_##name##_key.keyfld) key) \
|
*/
|
||||||
|
#define DEFINE_RB_LOOKUP_FUNC2(name, type, keyfld, cmpexp, keyexp, \
|
||||||
|
lookup_param_type, nodefld) \
|
||||||
|
static type *lookup_##name(struct rb_root *root, lookup_param_type key) \
|
||||||
{ \
|
{ \
|
||||||
struct rb_node *n = root->rb_node; \
|
struct rb_node *n = root->rb_node; \
|
||||||
\
|
\
|
||||||
while (n) { \
|
while (n) { \
|
||||||
type *cur = rb_entry(n, type, nodefld); \
|
type *cur = rb_entry(n, type, nodefld); \
|
||||||
|
int cmp; \
|
||||||
\
|
\
|
||||||
if (key < cur->keyfld) \
|
cmp = cmpexp(key, keyexp(cur->keyfld)); \
|
||||||
|
if (cmp < 0) \
|
||||||
n = n->rb_left; \
|
n = n->rb_left; \
|
||||||
else if (key > cur->keyfld) \
|
else if (cmp > 0) \
|
||||||
n = n->rb_right; \
|
n = n->rb_right; \
|
||||||
else \
|
else \
|
||||||
return cur; \
|
return cur; \
|
||||||
|
@ -238,6 +246,23 @@ static type *lookup_##name(struct rb_root *root, \
|
||||||
return NULL; \
|
return NULL; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define DEFINE_RB_FUNCS2(name, type, keyfld, cmpexp, keyexp, \
|
||||||
|
lookup_param_type, nodefld) \
|
||||||
|
DEFINE_RB_INSDEL_FUNCS2(name, type, keyfld, cmpexp, keyexp, nodefld) \
|
||||||
|
DEFINE_RB_LOOKUP_FUNC2(name, type, keyfld, cmpexp, keyexp, \
|
||||||
|
lookup_param_type, nodefld)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Shorthands for integer keys.
|
||||||
|
*/
|
||||||
|
#define DEFINE_RB_INSDEL_FUNCS(name, type, keyfld, nodefld) \
|
||||||
|
DEFINE_RB_INSDEL_FUNCS2(name, type, keyfld, RB_CMP3WAY, RB_BYVAL, nodefld)
|
||||||
|
|
||||||
|
#define DEFINE_RB_LOOKUP_FUNC(name, type, keyfld, nodefld) \
|
||||||
|
extern type __lookup_##name##_key; \
|
||||||
|
DEFINE_RB_LOOKUP_FUNC2(name, type, keyfld, RB_CMP3WAY, RB_BYVAL, \
|
||||||
|
typeof(__lookup_##name##_key.keyfld), nodefld)
|
||||||
|
|
||||||
#define DEFINE_RB_FUNCS(name, type, keyfld, nodefld) \
|
#define DEFINE_RB_FUNCS(name, type, keyfld, nodefld) \
|
||||||
DEFINE_RB_INSDEL_FUNCS(name, type, keyfld, nodefld) \
|
DEFINE_RB_INSDEL_FUNCS(name, type, keyfld, nodefld) \
|
||||||
DEFINE_RB_LOOKUP_FUNC(name, type, keyfld, nodefld)
|
DEFINE_RB_LOOKUP_FUNC(name, type, keyfld, nodefld)
|
||||||
|
|
Loading…
Reference in New Issue