libceph: add non-asserting rbtree insertion helper
authorIlya Dryomov <idryomov@gmail.com>
Tue, 19 May 2020 14:46:47 +0000 (16:46 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 1 Jun 2020 11:22:53 +0000 (13:22 +0200)
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>
include/linux/ceph/libceph.h
net/ceph/osdmap.c

index 525b7c3..4b5a47b 100644 (file)
@@ -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)                        \
 {                                                                      \
index 2a6e63a..5d00ce2 100644 (file)
@@ -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);
        }