]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
libceph: ADDR2 support for monmap
authorJeff Layton <jlayton@kernel.org>
Fri, 31 May 2019 19:32:28 +0000 (15:32 -0400)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 8 Jul 2019 12:01:43 +0000 (14:01 +0200)
Switch the MonMap decoder to use the new decoding routine for
entity_addr_t's.

Signed-off-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
include/linux/ceph/mon_client.h
net/ceph/mon_client.c

index 3a4688af7455ea7e61d0b02a1b6b843af68c017e..b4d134d3312ab7d1cc7f4f1db8a552fd859e29cc 100644 (file)
@@ -104,7 +104,6 @@ struct ceph_mon_client {
 #endif
 };
 
-extern struct ceph_monmap *ceph_monmap_decode(void *p, void *end);
 extern int ceph_monmap_contains(struct ceph_monmap *m,
                                struct ceph_entity_addr *addr);
 
index 895679d3529b8e3b77fcbcc3f9b88c5204239087..0520bf9825aa3edd3436c70bdee15cc9bede07cc 100644 (file)
@@ -39,7 +39,7 @@ static int __validate_auth(struct ceph_mon_client *monc);
 /*
  * Decode a monmap blob (e.g., during mount).
  */
-struct ceph_monmap *ceph_monmap_decode(void *p, void *end)
+static struct ceph_monmap *ceph_monmap_decode(void *p, void *end)
 {
        struct ceph_monmap *m = NULL;
        int i, err = -EINVAL;
@@ -50,7 +50,7 @@ struct ceph_monmap *ceph_monmap_decode(void *p, void *end)
        ceph_decode_32_safe(&p, end, len, bad);
        ceph_decode_need(&p, end, len, bad);
 
-       dout("monmap_decode %p %p len %d\n", p, end, (int)(end-p));
+       dout("monmap_decode %p %p len %d (%d)\n", p, end, len, (int)(end-p));
        p += sizeof(u16);  /* skip version */
 
        ceph_decode_need(&p, end, sizeof(fsid) + 2*sizeof(u32), bad);
@@ -58,7 +58,6 @@ struct ceph_monmap *ceph_monmap_decode(void *p, void *end)
        epoch = ceph_decode_32(&p);
 
        num_mon = ceph_decode_32(&p);
-       ceph_decode_need(&p, end, num_mon*sizeof(m->mon_inst[0]), bad);
 
        if (num_mon > CEPH_MAX_MON)
                goto bad;
@@ -68,17 +67,22 @@ struct ceph_monmap *ceph_monmap_decode(void *p, void *end)
        m->fsid = fsid;
        m->epoch = epoch;
        m->num_mon = num_mon;
-       ceph_decode_copy(&p, m->mon_inst, num_mon*sizeof(m->mon_inst[0]));
-       for (i = 0; i < num_mon; i++)
-               ceph_decode_addr(&m->mon_inst[i].addr);
-
+       for (i = 0; i < num_mon; ++i) {
+               struct ceph_entity_inst *inst = &m->mon_inst[i];
+
+               /* copy name portion */
+               ceph_decode_copy_safe(&p, end, &inst->name,
+                                       sizeof(inst->name), bad);
+               err = ceph_decode_entity_addr(&p, end, &inst->addr);
+               if (err)
+                       goto bad;
+       }
        dout("monmap_decode epoch %d, num_mon %d\n", m->epoch,
             m->num_mon);
        for (i = 0; i < m->num_mon; i++)
                dout("monmap_decode  mon%d is %s\n", i,
                     ceph_pr_addr(&m->mon_inst[i].addr));
        return m;
-
 bad:
        dout("monmap_decode failed with %d\n", err);
        kfree(m);
@@ -469,6 +473,7 @@ static void ceph_monc_handle_map(struct ceph_mon_client *monc,
        if (IS_ERR(monmap)) {
                pr_err("problem decoding monmap, %d\n",
                       (int)PTR_ERR(monmap));
+               ceph_msg_dump(msg);
                goto out;
        }