diff options
author | Ilya Dryomov <ilya.dryomov@inktank.com> | 2014-03-13 10:36:13 -0400 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2014-04-05 00:07:37 -0400 |
commit | a2505d63ee0541d9b4685250b033192e68222e97 (patch) | |
tree | 887b25757a76a7738290c17fb8ecd095bc0e68dd | |
parent | 38a8d560231b45489d5b12f5c7d0edfba94e1f30 (diff) |
libceph: split osdmap allocation and decode steps
Split osdmap allocation and initialization into a separate function,
ceph_osdmap_decode().
Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com>
Reviewed-by: Alex Elder <elder@linaro.org>
-rw-r--r-- | include/linux/ceph/osdmap.h | 2 | ||||
-rw-r--r-- | net/ceph/osd_client.c | 2 | ||||
-rw-r--r-- | net/ceph/osdmap.c | 44 |
3 files changed, 31 insertions, 17 deletions
diff --git a/include/linux/ceph/osdmap.h b/include/linux/ceph/osdmap.h index 8c8b3cefc28b..46c3e304c3d8 100644 --- a/include/linux/ceph/osdmap.h +++ b/include/linux/ceph/osdmap.h | |||
@@ -156,7 +156,7 @@ static inline int ceph_decode_pgid(void **p, void *end, struct ceph_pg *pgid) | |||
156 | return 0; | 156 | return 0; |
157 | } | 157 | } |
158 | 158 | ||
159 | extern struct ceph_osdmap *osdmap_decode(void **p, void *end); | 159 | extern struct ceph_osdmap *ceph_osdmap_decode(void **p, void *end); |
160 | extern struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | 160 | extern struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, |
161 | struct ceph_osdmap *map, | 161 | struct ceph_osdmap *map, |
162 | struct ceph_messenger *msgr); | 162 | struct ceph_messenger *msgr); |
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index 71830d79b0f4..6f64eec18851 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c | |||
@@ -2062,7 +2062,7 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) | |||
2062 | int skipped_map = 0; | 2062 | int skipped_map = 0; |
2063 | 2063 | ||
2064 | dout("taking full map %u len %d\n", epoch, maplen); | 2064 | dout("taking full map %u len %d\n", epoch, maplen); |
2065 | newmap = osdmap_decode(&p, p+maplen); | 2065 | newmap = ceph_osdmap_decode(&p, p+maplen); |
2066 | if (IS_ERR(newmap)) { | 2066 | if (IS_ERR(newmap)) { |
2067 | err = PTR_ERR(newmap); | 2067 | err = PTR_ERR(newmap); |
2068 | goto bad; | 2068 | goto bad; |
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 | */ |
687 | struct ceph_osdmap *osdmap_decode(void **p, void *end) | 687 | static 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 | ||
824 | bad: | 815 | bad: |
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 | */ | ||
827 | struct 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? */ |