diff options
Diffstat (limited to 'net/ceph/osdmap.c')
-rw-r--r-- | net/ceph/osdmap.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c index c67a309fdfc2..c0fc517ab321 100644 --- a/net/ceph/osdmap.c +++ b/net/ceph/osdmap.c | |||
@@ -343,7 +343,7 @@ bad: | |||
343 | 343 | ||
344 | /* | 344 | /* |
345 | * rbtree of pg_mapping for handling pg_temp (explicit mapping of pgid | 345 | * rbtree of pg_mapping for handling pg_temp (explicit mapping of pgid |
346 | * to a set of osds) | 346 | * to a set of osds) and primary_temp (explicit primary setting) |
347 | */ | 347 | */ |
348 | static int pgid_cmp(struct ceph_pg l, struct ceph_pg r) | 348 | static int pgid_cmp(struct ceph_pg l, struct ceph_pg r) |
349 | { | 349 | { |
@@ -633,6 +633,13 @@ void ceph_osdmap_destroy(struct ceph_osdmap *map) | |||
633 | rb_erase(&pg->node, &map->pg_temp); | 633 | rb_erase(&pg->node, &map->pg_temp); |
634 | kfree(pg); | 634 | kfree(pg); |
635 | } | 635 | } |
636 | while (!RB_EMPTY_ROOT(&map->primary_temp)) { | ||
637 | struct ceph_pg_mapping *pg = | ||
638 | rb_entry(rb_first(&map->primary_temp), | ||
639 | struct ceph_pg_mapping, node); | ||
640 | rb_erase(&pg->node, &map->primary_temp); | ||
641 | kfree(pg); | ||
642 | } | ||
636 | while (!RB_EMPTY_ROOT(&map->pg_pools)) { | 643 | while (!RB_EMPTY_ROOT(&map->pg_pools)) { |
637 | struct ceph_pg_pool_info *pi = | 644 | struct ceph_pg_pool_info *pi = |
638 | rb_entry(rb_first(&map->pg_pools), | 645 | rb_entry(rb_first(&map->pg_pools), |
@@ -966,6 +973,7 @@ struct ceph_osdmap *ceph_osdmap_decode(void **p, void *end) | |||
966 | return ERR_PTR(-ENOMEM); | 973 | return ERR_PTR(-ENOMEM); |
967 | 974 | ||
968 | map->pg_temp = RB_ROOT; | 975 | map->pg_temp = RB_ROOT; |
976 | map->primary_temp = RB_ROOT; | ||
969 | mutex_init(&map->crush_scratch_mutex); | 977 | mutex_init(&map->crush_scratch_mutex); |
970 | 978 | ||
971 | ret = osdmap_decode(p, end, map); | 979 | ret = osdmap_decode(p, end, map); |