diff options
Diffstat (limited to 'fs/ceph/osdmap.c')
-rw-r--r-- | fs/ceph/osdmap.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/fs/ceph/osdmap.c b/fs/ceph/osdmap.c index 50ce64ebd330..416d46adbf87 100644 --- a/fs/ceph/osdmap.c +++ b/fs/ceph/osdmap.c | |||
@@ -568,6 +568,7 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end) | |||
568 | if (ev > CEPH_PG_POOL_VERSION) { | 568 | if (ev > CEPH_PG_POOL_VERSION) { |
569 | pr_warning("got unknown v %d > %d of ceph_pg_pool\n", | 569 | pr_warning("got unknown v %d > %d of ceph_pg_pool\n", |
570 | ev, CEPH_PG_POOL_VERSION); | 570 | ev, CEPH_PG_POOL_VERSION); |
571 | kfree(pi); | ||
571 | goto bad; | 572 | goto bad; |
572 | } | 573 | } |
573 | __decode_pool(p, pi); | 574 | __decode_pool(p, pi); |
@@ -830,12 +831,13 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | |||
830 | /* remove any? */ | 831 | /* remove any? */ |
831 | while (rbp && pgid_cmp(rb_entry(rbp, struct ceph_pg_mapping, | 832 | while (rbp && pgid_cmp(rb_entry(rbp, struct ceph_pg_mapping, |
832 | node)->pgid, pgid) <= 0) { | 833 | node)->pgid, pgid) <= 0) { |
833 | struct rb_node *cur = rbp; | 834 | struct ceph_pg_mapping *cur = |
835 | rb_entry(rbp, struct ceph_pg_mapping, node); | ||
836 | |||
834 | rbp = rb_next(rbp); | 837 | rbp = rb_next(rbp); |
835 | dout(" removed pg_temp %llx\n", | 838 | dout(" removed pg_temp %llx\n", *(u64 *)&cur->pgid); |
836 | *(u64 *)&rb_entry(cur, struct ceph_pg_mapping, | 839 | rb_erase(&cur->node, &map->pg_temp); |
837 | node)->pgid); | 840 | kfree(cur); |
838 | rb_erase(cur, &map->pg_temp); | ||
839 | } | 841 | } |
840 | 842 | ||
841 | if (pglen) { | 843 | if (pglen) { |
@@ -851,19 +853,22 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | |||
851 | for (j = 0; j < pglen; j++) | 853 | for (j = 0; j < pglen; j++) |
852 | pg->osds[j] = ceph_decode_32(p); | 854 | pg->osds[j] = ceph_decode_32(p); |
853 | err = __insert_pg_mapping(pg, &map->pg_temp); | 855 | err = __insert_pg_mapping(pg, &map->pg_temp); |
854 | if (err) | 856 | if (err) { |
857 | kfree(pg); | ||
855 | goto bad; | 858 | goto bad; |
859 | } | ||
856 | dout(" added pg_temp %llx len %d\n", *(u64 *)&pgid, | 860 | dout(" added pg_temp %llx len %d\n", *(u64 *)&pgid, |
857 | pglen); | 861 | pglen); |
858 | } | 862 | } |
859 | } | 863 | } |
860 | while (rbp) { | 864 | while (rbp) { |
861 | struct rb_node *cur = rbp; | 865 | struct ceph_pg_mapping *cur = |
866 | rb_entry(rbp, struct ceph_pg_mapping, node); | ||
867 | |||
862 | rbp = rb_next(rbp); | 868 | rbp = rb_next(rbp); |
863 | dout(" removed pg_temp %llx\n", | 869 | dout(" removed pg_temp %llx\n", *(u64 *)&cur->pgid); |
864 | *(u64 *)&rb_entry(cur, struct ceph_pg_mapping, | 870 | rb_erase(&cur->node, &map->pg_temp); |
865 | node)->pgid); | 871 | kfree(cur); |
866 | rb_erase(cur, &map->pg_temp); | ||
867 | } | 872 | } |
868 | 873 | ||
869 | /* ignore the rest */ | 874 | /* ignore the rest */ |