summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2009-12-14 15:13:47 -0800
committerSage Weil <sage@newdream.net>2009-12-21 16:39:52 -0800
commit9ec7cab14e6de732d4e7c355fe67c5810c32c758 (patch)
tree2f512034bc7db2b4ca8fe47ceea06ac99a8cab40
parent93c20d98c29ccefa039c3843ccc37122caaf3d31 (diff)
downloadlinux-3.10-9ec7cab14e6de732d4e7c355fe67c5810c32c758.tar.gz
linux-3.10-9ec7cab14e6de732d4e7c355fe67c5810c32c758.tar.bz2
linux-3.10-9ec7cab14e6de732d4e7c355fe67c5810c32c758.zip
ceph: hex dump corrupt server data to KERN_DEBUG
Also, print fsid using standard format, NOT hex dump. Signed-off-by: Sage Weil <sage@newdream.net>
-rw-r--r--fs/ceph/caps.c1
-rw-r--r--fs/ceph/mds_client.c4
-rw-r--r--fs/ceph/mdsmap.c4
-rw-r--r--fs/ceph/messenger.c20
-rw-r--r--fs/ceph/messenger.h2
-rw-r--r--fs/ceph/mon_client.c2
-rw-r--r--fs/ceph/osd_client.c2
-rw-r--r--fs/ceph/osdmap.c3
-rw-r--r--fs/ceph/snap.c1
-rw-r--r--fs/ceph/super.c9
10 files changed, 41 insertions, 7 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index 9b9ce143ac1..dfb509f5354 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -2681,6 +2681,7 @@ done:
bad:
pr_err("ceph_handle_caps: corrupt message\n");
+ ceph_msg_dump(msg);
return;
}
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 739093f281d..29a93fe35f8 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -1650,6 +1650,7 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg)
return;
if (msg->front.iov_len < sizeof(*head)) {
pr_err("mdsc_handle_reply got corrupt (short) reply\n");
+ ceph_msg_dump(msg);
return;
}
@@ -1740,6 +1741,7 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg)
mutex_lock(&session->s_mutex);
if (err < 0) {
pr_err("mdsc_handle_reply got corrupt reply mds%d\n", mds);
+ ceph_msg_dump(msg);
goto out_err;
}
@@ -1929,6 +1931,7 @@ static void handle_session(struct ceph_mds_session *session,
bad:
pr_err("mdsc_handle_session corrupt message mds%d len %d\n", mds,
(int)msg->front.iov_len);
+ ceph_msg_dump(msg);
return;
}
@@ -2394,6 +2397,7 @@ out:
bad:
pr_err("corrupt lease message\n");
+ ceph_msg_dump(msg);
}
void ceph_mdsc_lease_send_msg(struct ceph_mds_session *session,
diff --git a/fs/ceph/mdsmap.c b/fs/ceph/mdsmap.c
index cad8d25861e..c4c498e6dfe 100644
--- a/fs/ceph/mdsmap.c
+++ b/fs/ceph/mdsmap.c
@@ -49,6 +49,7 @@ int ceph_mdsmap_get_random_mds(struct ceph_mdsmap *m)
struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end)
{
struct ceph_mdsmap *m;
+ const void *start = *p;
int i, j, n;
int err = -EINVAL;
u16 version;
@@ -154,6 +155,9 @@ badmem:
err = -ENOMEM;
bad:
pr_err("corrupt mdsmap\n");
+ print_hex_dump(KERN_DEBUG, "mdsmap: ",
+ DUMP_PREFIX_OFFSET, 16, 1,
+ start, end - start, true);
ceph_mdsmap_destroy(m);
return ERR_PTR(-EINVAL);
}
diff --git a/fs/ceph/messenger.c b/fs/ceph/messenger.c
index d5eef76a253..b10f88c5670 100644
--- a/fs/ceph/messenger.c
+++ b/fs/ceph/messenger.c
@@ -2115,3 +2115,23 @@ void ceph_msg_last_put(struct kref *kref)
else
ceph_msg_kfree(m);
}
+
+void ceph_msg_dump(struct ceph_msg *msg)
+{
+ pr_debug("msg_dump %p (front_max %d nr_pages %d)\n", msg,
+ msg->front_max, msg->nr_pages);
+ print_hex_dump(KERN_DEBUG, "header: ",
+ DUMP_PREFIX_OFFSET, 16, 1,
+ &msg->hdr, sizeof(msg->hdr), true);
+ print_hex_dump(KERN_DEBUG, " front: ",
+ DUMP_PREFIX_OFFSET, 16, 1,
+ msg->front.iov_base, msg->front.iov_len, true);
+ if (msg->middle)
+ print_hex_dump(KERN_DEBUG, "middle: ",
+ DUMP_PREFIX_OFFSET, 16, 1,
+ msg->middle->vec.iov_base,
+ msg->middle->vec.iov_len, true);
+ print_hex_dump(KERN_DEBUG, "footer: ",
+ DUMP_PREFIX_OFFSET, 16, 1,
+ &msg->footer, sizeof(msg->footer), true);
+}
diff --git a/fs/ceph/messenger.h b/fs/ceph/messenger.h
index eff5cb5197f..e04c214b4f6 100644
--- a/fs/ceph/messenger.h
+++ b/fs/ceph/messenger.h
@@ -254,4 +254,6 @@ static inline void ceph_msg_put(struct ceph_msg *msg)
kref_put(&msg->kref, ceph_msg_last_put);
}
+extern void ceph_msg_dump(struct ceph_msg *msg);
+
#endif
diff --git a/fs/ceph/mon_client.c b/fs/ceph/mon_client.c
index a76da5e6dbd..775a9c029c5 100644
--- a/fs/ceph/mon_client.c
+++ b/fs/ceph/mon_client.c
@@ -242,6 +242,7 @@ static void handle_subscribe_ack(struct ceph_mon_client *monc,
return;
bad:
pr_err("got corrupt subscribe-ack msg\n");
+ ceph_msg_dump(msg);
}
/*
@@ -364,6 +365,7 @@ static void handle_statfs_reply(struct ceph_mon_client *monc,
bad:
pr_err("corrupt statfs reply, no tid\n");
+ ceph_msg_dump(msg);
}
/*
diff --git a/fs/ceph/osd_client.c b/fs/ceph/osd_client.c
index 63482ef3de0..4bfe880d53c 100644
--- a/fs/ceph/osd_client.c
+++ b/fs/ceph/osd_client.c
@@ -773,6 +773,7 @@ bad:
pr_err("corrupt osd_op_reply got %d %d expected %d\n",
(int)msg->front.iov_len, le32_to_cpu(msg->hdr.front_len),
(int)sizeof(*rhead));
+ ceph_msg_dump(msg);
}
@@ -964,6 +965,7 @@ done:
bad:
pr_err("osdc handle_map corrupt msg\n");
+ ceph_msg_dump(msg);
up_write(&osdc->map_sem);
return;
}
diff --git a/fs/ceph/osdmap.c b/fs/ceph/osdmap.c
index be5318aa771..8c8ffe5ef7d 100644
--- a/fs/ceph/osdmap.c
+++ b/fs/ceph/osdmap.c
@@ -726,6 +726,9 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
bad:
pr_err("corrupt inc osdmap epoch %d off %d (%p of %p-%p)\n",
epoch, (int)(*p - start), *p, start, end);
+ print_hex_dump(KERN_DEBUG, "osdmap: ",
+ DUMP_PREFIX_OFFSET, 16, 1,
+ start, end - start, true);
if (newcrush)
crush_destroy(newcrush);
return ERR_PTR(err);
diff --git a/fs/ceph/snap.c b/fs/ceph/snap.c
index 52f46a1208f..dcf18d92130 100644
--- a/fs/ceph/snap.c
+++ b/fs/ceph/snap.c
@@ -877,6 +877,7 @@ split_skip_inode:
bad:
pr_err("corrupt snap message from mds%d\n", mds);
+ ceph_msg_dump(msg);
out:
if (locked_rwsem)
up_write(&mdsc->snap_rwsem);
diff --git a/fs/ceph/super.c b/fs/ceph/super.c
index a828943296c..6d02a166f8f 100644
--- a/fs/ceph/super.c
+++ b/fs/ceph/super.c
@@ -602,13 +602,8 @@ int ceph_check_fsid(struct ceph_client *client, struct ceph_fsid *fsid)
{
if (client->have_fsid) {
if (ceph_fsid_compare(&client->fsid, fsid)) {
- print_hex_dump(KERN_ERR, "this fsid: ",
- DUMP_PREFIX_NONE, 16, 1,
- (void *)fsid, 16, 0);
- print_hex_dump(KERN_ERR, " old fsid: ",
- DUMP_PREFIX_NONE, 16, 1,
- (void *)&client->fsid, 16, 0);
- pr_err("fsid mismatch\n");
+ pr_err("bad fsid, had " FSID_FORMAT " got " FSID_FORMAT,
+ PR_FSID(&client->fsid), PR_FSID(fsid));
return -1;
}
} else {