ceph: fix up unexpected message handling
authorSage Weil <sage@newdream.net>
Sat, 20 Feb 2010 05:43:23 +0000 (21:43 -0800)
committerSage Weil <sage@newdream.net>
Tue, 23 Feb 2010 22:26:29 +0000 (14:26 -0800)
Fix skipping of unexpected message types from osd, mon.

Clean up pr_info and debug output.

Signed-off-by: Sage Weil <sage@newdream.net>
fs/ceph/messenger.c
fs/ceph/mon_client.c
fs/ceph/osd_client.c

index ca2ad0e5bb28a0e963afa9fe203868c400653d9e..fdda707aa1376831ad060505880c93745adbdfc5 100644 (file)
@@ -1361,7 +1361,7 @@ static int read_partial_message(struct ceph_connection *con)
                con->in_msg = ceph_alloc_msg(con, &con->in_hdr, &skip);
                if (skip) {
                        /* skip this message */
-                       pr_err("alloc_msg returned NULL, skipping message\n");
+                       dout("alloc_msg returned NULL, skipping message\n");
                        con->in_base_pos = -front_len - middle_len - data_len -
                                sizeof(m->footer);
                        con->in_tag = CEPH_MSGR_TAG_READY;
@@ -1370,7 +1370,8 @@ static int read_partial_message(struct ceph_connection *con)
                if (IS_ERR(con->in_msg)) {
                        ret = PTR_ERR(con->in_msg);
                        con->in_msg = NULL;
-                       con->error_msg = "error allocating memory for incoming message";
+                       con->error_msg =
+                               "error allocating memory for incoming message";
                        return ret;
                }
                m = con->in_msg;
index 40d7d90bbed111243e56242ba50aeb46ddacc785..890597c09d43f6ed782d83cf0f53985902a97250 100644 (file)
@@ -763,7 +763,7 @@ static struct ceph_msg *mon_alloc_msg(struct ceph_connection *con,
        struct ceph_mon_client *monc = con->private;
        int type = le16_to_cpu(hdr->type);
        int front_len = le32_to_cpu(hdr->front_len);
-       struct ceph_msg *m;
+       struct ceph_msg *m = NULL;
 
        *skip = 0;
 
@@ -777,13 +777,17 @@ static struct ceph_msg *mon_alloc_msg(struct ceph_connection *con,
        case CEPH_MSG_AUTH_REPLY:
                m = ceph_msgpool_get(&monc->msgpool_auth_reply, front_len);
                break;
-       default:
-               return NULL;
+       case CEPH_MSG_MON_MAP:
+       case CEPH_MSG_MDS_MAP:
+       case CEPH_MSG_OSD_MAP:
+               m = ceph_msg_new(type, front_len, 0, 0, NULL);
+               break;
        }
 
-       if (!m)
+       if (!m) {
+               pr_info("alloc_msg unknown type %d\n", type);
                *skip = 1;
-
+       }
        return m;
 }
 
index fa0f73703954b4f1c8a568d841155cda99ced260..ffd819c5a5ddb2be3fe6f06cbca8e3ee8ceca5b4 100644 (file)
@@ -1396,31 +1396,30 @@ static void dispatch(struct ceph_connection *con, struct ceph_msg *msg)
        ceph_msg_put(msg);
 }
 
-static struct ceph_msg *alloc_msg(struct ceph_connection *con,
+/*
+ * lookup and return message for incoming reply
+ */
+static struct ceph_msg *get_reply(struct ceph_connection *con,
                                  struct ceph_msg_header *hdr,
                                  int *skip)
 {
        struct ceph_osd *osd = con->private;
        struct ceph_osd_client *osdc = osd->o_osdc;
-       int type = le16_to_cpu(hdr->type);
-       int front = le32_to_cpu(hdr->front_len);
-       int data_len = le32_to_cpu(hdr->data_len);
        struct ceph_msg *m;
        struct ceph_osd_request *req;
+       int front = le32_to_cpu(hdr->front_len);
+       int data_len = le32_to_cpu(hdr->data_len);
        u64 tid;
        int err;
 
-       *skip = 0;
-       if (type != CEPH_MSG_OSD_OPREPLY)
-               return NULL;
-
        tid = le64_to_cpu(hdr->tid);
        mutex_lock(&osdc->request_mutex);
        req = __lookup_request(osdc, tid);
        if (!req) {
                *skip = 1;
                m = NULL;
-               dout("alloc_msg unknown tid %llu\n", tid);
+               pr_info("alloc_msg unknown tid %llu from osd%d\n", tid,
+                       osd->o_osd);
                goto out;
        }
        m = __get_next_reply(con, req, front);
@@ -1437,11 +1436,33 @@ static struct ceph_msg *alloc_msg(struct ceph_connection *con,
                        m = ERR_PTR(err);
                }
        }
+       *skip = 0;
 
 out:
        mutex_unlock(&osdc->request_mutex);
-
        return m;
+
+}
+
+static struct ceph_msg *alloc_msg(struct ceph_connection *con,
+                                 struct ceph_msg_header *hdr,
+                                 int *skip)
+{
+       struct ceph_osd *osd = con->private;
+       int type = le16_to_cpu(hdr->type);
+       int front = le32_to_cpu(hdr->front_len);
+
+       switch (type) {
+       case CEPH_MSG_OSD_MAP:
+               return ceph_msg_new(type, front, 0, 0, NULL);
+       case CEPH_MSG_OSD_OPREPLY:
+               return get_reply(con, hdr, skip);
+       default:
+               pr_info("alloc_msg unexpected msg type %d from osd%d\n", type,
+                       osd->o_osd);
+               *skip = 1;
+               return NULL;
+       }
 }
 
 /*