aboutsummaryrefslogtreecommitdiffstats
path: root/net/ceph/osdmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ceph/osdmap.c')
-rw-r--r--net/ceph/osdmap.c44
1 files changed, 29 insertions, 15 deletions
diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c
index 4dd000d128fd..a82df6ea0749 100644
--- a/net/ceph/osdmap.c
+++ b/net/ceph/osdmap.c
@@ -684,9 +684,8 @@ static int osdmap_set_max_osd(struct ceph_osdmap *map, int max)
684/* 684/*
685 * decode a full map. 685 * decode a full map.
686 */ 686 */
687struct ceph_osdmap *osdmap_decode(void **p, void *end) 687static int osdmap_decode(void **p, void *end, struct ceph_osdmap *map)
688{ 688{
689 struct ceph_osdmap *map;
690 u16 version; 689 u16 version;
691 u32 len, max, i; 690 u32 len, max, i;
692 int err = -EINVAL; 691 int err = -EINVAL;
@@ -694,14 +693,7 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
694 void *start = *p; 693 void *start = *p;
695 struct ceph_pg_pool_info *pi; 694 struct ceph_pg_pool_info *pi;
696 695
697 dout("osdmap_decode %p to %p len %d\n", *p, end, (int)(end - *p)); 696 dout("%s %p to %p len %d\n", __func__, *p, end, (int)(end - *p));
698
699 map = kzalloc(sizeof(*map), GFP_NOFS);
700 if (map == NULL)
701 return ERR_PTR(-ENOMEM);
702
703 map->pg_temp = RB_ROOT;
704 mutex_init(&map->crush_scratch_mutex);
705 697
706 ceph_decode_16_safe(p, end, version, bad); 698 ceph_decode_16_safe(p, end, version, bad);
707 if (version > 6) { 699 if (version > 6) {
@@ -751,7 +743,6 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
751 err = osdmap_set_max_osd(map, max); 743 err = osdmap_set_max_osd(map, max);
752 if (err < 0) 744 if (err < 0)
753 goto bad; 745 goto bad;
754 dout("osdmap_decode max_osd = %d\n", map->max_osd);
755 746
756 /* osds */ 747 /* osds */
757 err = -EINVAL; 748 err = -EINVAL;
@@ -819,7 +810,7 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
819 *p = end; 810 *p = end;
820 811
821 dout("full osdmap epoch %d max_osd %d\n", map->epoch, map->max_osd); 812 dout("full osdmap epoch %d max_osd %d\n", map->epoch, map->max_osd);
822 return map; 813 return 0;
823 814
824bad: 815bad:
825 pr_err("corrupt full osdmap (%d) epoch %d off %d (%p of %p-%p)\n", 816 pr_err("corrupt full osdmap (%d) epoch %d off %d (%p of %p-%p)\n",
@@ -827,8 +818,31 @@ bad:
827 print_hex_dump(KERN_DEBUG, "osdmap: ", 818 print_hex_dump(KERN_DEBUG, "osdmap: ",
828 DUMP_PREFIX_OFFSET, 16, 1, 819 DUMP_PREFIX_OFFSET, 16, 1,
829 start, end - start, true); 820 start, end - start, true);
830 ceph_osdmap_destroy(map); 821 return err;
831 return ERR_PTR(err); 822}
823
824/*
825 * Allocate and decode a full map.
826 */
827struct ceph_osdmap *ceph_osdmap_decode(void **p, void *end)
828{
829 struct ceph_osdmap *map;
830 int ret;
831
832 map = kzalloc(sizeof(*map), GFP_NOFS);
833 if (!map)
834 return ERR_PTR(-ENOMEM);
835
836 map->pg_temp = RB_ROOT;
837 mutex_init(&map->crush_scratch_mutex);
838
839 ret = osdmap_decode(p, end, map);
840 if (ret) {
841 ceph_osdmap_destroy(map);
842 return ERR_PTR(ret);
843 }
844
845 return map;
832} 846}
833 847
834/* 848/*
@@ -872,7 +886,7 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
872 if (len > 0) { 886 if (len > 0) {
873 dout("apply_incremental full map len %d, %p to %p\n", 887 dout("apply_incremental full map len %d, %p to %p\n",
874 len, *p, end); 888 len, *p, end);
875 return osdmap_decode(p, min(*p+len, end)); 889 return ceph_osdmap_decode(p, min(*p+len, end));
876 } 890 }
877 891
878 /* new crush? */ 892 /* new crush? */