aboutsummaryrefslogtreecommitdiffstats
path: root/net/ceph
diff options
context:
space:
mode:
authorIlya Dryomov <ilya.dryomov@inktank.com>2014-03-13 10:36:13 -0400
committerSage Weil <sage@inktank.com>2014-04-05 00:07:35 -0400
commit38a8d560231b45489d5b12f5c7d0edfba94e1f30 (patch)
tree6ae457c41c74f0c4f7578d0112300f3e159fdbbf /net/ceph
parent1c00240e007d14d3242fa490b50166b4f1b2770a (diff)
libceph: dump osdmap and enhance output on decode errors
Dump osdmap in hex on both full and incremental decode errors, to make it easier to match the contents with error offset. dout() map epoch and max_osd value on success. Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com> Reviewed-by: Alex Elder <elder@linaro.org>
Diffstat (limited to 'net/ceph')
-rw-r--r--net/ceph/osdmap.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c
index 9d1aaa24def6..4dd000d128fd 100644
--- a/net/ceph/osdmap.c
+++ b/net/ceph/osdmap.c
@@ -690,6 +690,7 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
690 u16 version; 690 u16 version;
691 u32 len, max, i; 691 u32 len, max, i;
692 int err = -EINVAL; 692 int err = -EINVAL;
693 u32 epoch = 0;
693 void *start = *p; 694 void *start = *p;
694 struct ceph_pg_pool_info *pi; 695 struct ceph_pg_pool_info *pi;
695 696
@@ -714,7 +715,7 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
714 715
715 ceph_decode_need(p, end, 2*sizeof(u64)+6*sizeof(u32), bad); 716 ceph_decode_need(p, end, 2*sizeof(u64)+6*sizeof(u32), bad);
716 ceph_decode_copy(p, &map->fsid, sizeof(map->fsid)); 717 ceph_decode_copy(p, &map->fsid, sizeof(map->fsid));
717 map->epoch = ceph_decode_32(p); 718 epoch = map->epoch = ceph_decode_32(p);
718 ceph_decode_copy(p, &map->created, sizeof(map->created)); 719 ceph_decode_copy(p, &map->created, sizeof(map->created));
719 ceph_decode_copy(p, &map->modified, sizeof(map->modified)); 720 ceph_decode_copy(p, &map->modified, sizeof(map->modified));
720 721
@@ -814,14 +815,18 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
814 goto bad; 815 goto bad;
815 } 816 }
816 817
817 /* ignore the rest of the map */ 818 /* ignore the rest */
818 *p = end; 819 *p = end;
819 820
820 dout("osdmap_decode done %p %p\n", *p, end); 821 dout("full osdmap epoch %d max_osd %d\n", map->epoch, map->max_osd);
821 return map; 822 return map;
822 823
823bad: 824bad:
824 dout("osdmap_decode fail err %d\n", err); 825 pr_err("corrupt full osdmap (%d) epoch %d off %d (%p of %p-%p)\n",
826 err, epoch, (int)(*p - start), *p, start, end);
827 print_hex_dump(KERN_DEBUG, "osdmap: ",
828 DUMP_PREFIX_OFFSET, 16, 1,
829 start, end - start, true);
825 ceph_osdmap_destroy(map); 830 ceph_osdmap_destroy(map);
826 return ERR_PTR(err); 831 return ERR_PTR(err);
827} 832}
@@ -845,6 +850,8 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
845 int err = -EINVAL; 850 int err = -EINVAL;
846 u16 version; 851 u16 version;
847 852
853 dout("%s %p to %p len %d\n", __func__, *p, end, (int)(end - *p));
854
848 ceph_decode_16_safe(p, end, version, bad); 855 ceph_decode_16_safe(p, end, version, bad);
849 if (version != 6) { 856 if (version != 6) {
850 pr_warning("got unknown v %d != 6 of inc osdmap\n", version); 857 pr_warning("got unknown v %d != 6 of inc osdmap\n", version);
@@ -1032,11 +1039,13 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
1032 1039
1033 /* ignore the rest */ 1040 /* ignore the rest */
1034 *p = end; 1041 *p = end;
1042
1043 dout("inc osdmap epoch %d max_osd %d\n", map->epoch, map->max_osd);
1035 return map; 1044 return map;
1036 1045
1037bad: 1046bad:
1038 pr_err("corrupt inc osdmap epoch %d off %d (%p of %p-%p)\n", 1047 pr_err("corrupt inc osdmap (%d) epoch %d off %d (%p of %p-%p)\n",
1039 epoch, (int)(*p - start), *p, start, end); 1048 err, epoch, (int)(*p - start), *p, start, end);
1040 print_hex_dump(KERN_DEBUG, "osdmap: ", 1049 print_hex_dump(KERN_DEBUG, "osdmap: ",
1041 DUMP_PREFIX_OFFSET, 16, 1, 1050 DUMP_PREFIX_OFFSET, 16, 1,
1042 start, end - start, true); 1051 start, end - start, true);