libceph: add non-asserting rbtree insertion helper
Needed for the next commit and useful for ceph_pg_pool_info tree as well. I'm leaving the asserting helper in for now, but we should look at getting rid of it in the future. Signed-off-by: Ilya Dryomov <idryomov@gmail.com> Reviewed-by: Jeff Layton <jlayton@kernel.org>
This commit is contained in:
Родитель
e64f44a884
Коммит
8a4b863c87
|
@ -188,7 +188,7 @@ static inline int calc_pages_for(u64 off, u64 len)
|
|||
#define RB_CMP3WAY(a, b) ((a) < (b) ? -1 : (a) > (b))
|
||||
|
||||
#define DEFINE_RB_INSDEL_FUNCS2(name, type, keyfld, cmpexp, keyexp, nodefld) \
|
||||
static void insert_##name(struct rb_root *root, type *t) \
|
||||
static bool __insert_##name(struct rb_root *root, type *t) \
|
||||
{ \
|
||||
struct rb_node **n = &root->rb_node; \
|
||||
struct rb_node *parent = NULL; \
|
||||
|
@ -206,11 +206,17 @@ static void insert_##name(struct rb_root *root, type *t) \
|
|||
else if (cmp > 0) \
|
||||
n = &(*n)->rb_right; \
|
||||
else \
|
||||
BUG(); \
|
||||
return false; \
|
||||
} \
|
||||
\
|
||||
rb_link_node(&t->nodefld, parent, n); \
|
||||
rb_insert_color(&t->nodefld, root); \
|
||||
return true; \
|
||||
} \
|
||||
static void __maybe_unused insert_##name(struct rb_root *root, type *t) \
|
||||
{ \
|
||||
if (!__insert_##name(root, t)) \
|
||||
BUG(); \
|
||||
} \
|
||||
static void erase_##name(struct rb_root *root, type *t) \
|
||||
{ \
|
||||
|
|
|
@ -636,48 +636,11 @@ DEFINE_RB_FUNCS2(pg_mapping, struct ceph_pg_mapping, pgid, ceph_pg_compare,
|
|||
/*
|
||||
* rbtree of pg pool info
|
||||
*/
|
||||
static int __insert_pg_pool(struct rb_root *root, struct ceph_pg_pool_info *new)
|
||||
{
|
||||
struct rb_node **p = &root->rb_node;
|
||||
struct rb_node *parent = NULL;
|
||||
struct ceph_pg_pool_info *pi = NULL;
|
||||
|
||||
while (*p) {
|
||||
parent = *p;
|
||||
pi = rb_entry(parent, struct ceph_pg_pool_info, node);
|
||||
if (new->id < pi->id)
|
||||
p = &(*p)->rb_left;
|
||||
else if (new->id > pi->id)
|
||||
p = &(*p)->rb_right;
|
||||
else
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
rb_link_node(&new->node, parent, p);
|
||||
rb_insert_color(&new->node, root);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct ceph_pg_pool_info *__lookup_pg_pool(struct rb_root *root, u64 id)
|
||||
{
|
||||
struct ceph_pg_pool_info *pi;
|
||||
struct rb_node *n = root->rb_node;
|
||||
|
||||
while (n) {
|
||||
pi = rb_entry(n, struct ceph_pg_pool_info, node);
|
||||
if (id < pi->id)
|
||||
n = n->rb_left;
|
||||
else if (id > pi->id)
|
||||
n = n->rb_right;
|
||||
else
|
||||
return pi;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
DEFINE_RB_FUNCS(pg_pool, struct ceph_pg_pool_info, id, node)
|
||||
|
||||
struct ceph_pg_pool_info *ceph_pg_pool_by_id(struct ceph_osdmap *map, u64 id)
|
||||
{
|
||||
return __lookup_pg_pool(&map->pg_pools, id);
|
||||
return lookup_pg_pool(&map->pg_pools, id);
|
||||
}
|
||||
|
||||
const char *ceph_pg_pool_name_by_id(struct ceph_osdmap *map, u64 id)
|
||||
|
@ -690,8 +653,7 @@ const char *ceph_pg_pool_name_by_id(struct ceph_osdmap *map, u64 id)
|
|||
if (WARN_ON_ONCE(id > (u64) INT_MAX))
|
||||
return NULL;
|
||||
|
||||
pi = __lookup_pg_pool(&map->pg_pools, (int) id);
|
||||
|
||||
pi = lookup_pg_pool(&map->pg_pools, id);
|
||||
return pi ? pi->name : NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(ceph_pg_pool_name_by_id);
|
||||
|
@ -714,14 +676,14 @@ u64 ceph_pg_pool_flags(struct ceph_osdmap *map, u64 id)
|
|||
{
|
||||
struct ceph_pg_pool_info *pi;
|
||||
|
||||
pi = __lookup_pg_pool(&map->pg_pools, id);
|
||||
pi = lookup_pg_pool(&map->pg_pools, id);
|
||||
return pi ? pi->flags : 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ceph_pg_pool_flags);
|
||||
|
||||
static void __remove_pg_pool(struct rb_root *root, struct ceph_pg_pool_info *pi)
|
||||
{
|
||||
rb_erase(&pi->node, root);
|
||||
erase_pg_pool(root, pi);
|
||||
kfree(pi->name);
|
||||
kfree(pi);
|
||||
}
|
||||
|
@ -903,7 +865,7 @@ static int decode_pool_names(void **p, void *end, struct ceph_osdmap *map)
|
|||
ceph_decode_32_safe(p, end, len, bad);
|
||||
dout(" pool %llu len %d\n", pool, len);
|
||||
ceph_decode_need(p, end, len, bad);
|
||||
pi = __lookup_pg_pool(&map->pg_pools, pool);
|
||||
pi = lookup_pg_pool(&map->pg_pools, pool);
|
||||
if (pi) {
|
||||
char *name = kstrndup(*p, len, GFP_NOFS);
|
||||
|
||||
|
@ -1154,18 +1116,18 @@ static int __decode_pools(void **p, void *end, struct ceph_osdmap *map,
|
|||
|
||||
ceph_decode_64_safe(p, end, pool, e_inval);
|
||||
|
||||
pi = __lookup_pg_pool(&map->pg_pools, pool);
|
||||
pi = lookup_pg_pool(&map->pg_pools, pool);
|
||||
if (!incremental || !pi) {
|
||||
pi = kzalloc(sizeof(*pi), GFP_NOFS);
|
||||
if (!pi)
|
||||
return -ENOMEM;
|
||||
|
||||
RB_CLEAR_NODE(&pi->node);
|
||||
pi->id = pool;
|
||||
|
||||
ret = __insert_pg_pool(&map->pg_pools, pi);
|
||||
if (ret) {
|
||||
if (!__insert_pg_pool(&map->pg_pools, pi)) {
|
||||
kfree(pi);
|
||||
return ret;
|
||||
return -EEXIST;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1829,7 +1791,7 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
|
|||
struct ceph_pg_pool_info *pi;
|
||||
|
||||
ceph_decode_64_safe(p, end, pool, e_inval);
|
||||
pi = __lookup_pg_pool(&map->pg_pools, pool);
|
||||
pi = lookup_pg_pool(&map->pg_pools, pool);
|
||||
if (pi)
|
||||
__remove_pg_pool(&map->pg_pools, pi);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче