Merge branch 'kbuild/rc-fixes' into kbuild/kconfig
[firefly-linux-kernel-4.4.55.git] / net / ceph / osdmap.c
index 5433fb0eb3c68596b375388b3df74a03c6e8441c..de73214b5d26c04989905bafc62bd9c056f2131c 100644 (file)
@@ -469,6 +469,22 @@ static struct ceph_pg_pool_info *__lookup_pg_pool(struct rb_root *root, int id)
        return NULL;
 }
 
+const char *ceph_pg_pool_name_by_id(struct ceph_osdmap *map, u64 id)
+{
+       struct ceph_pg_pool_info *pi;
+
+       if (id == CEPH_NOPOOL)
+               return NULL;
+
+       if (WARN_ON_ONCE(id > (u64) INT_MAX))
+               return NULL;
+
+       pi = __lookup_pg_pool(&map->pg_pools, (int) id);
+
+       return pi ? pi->name : NULL;
+}
+EXPORT_SYMBOL(ceph_pg_pool_name_by_id);
+
 int ceph_pg_poolid_by_name(struct ceph_osdmap *map, const char *name)
 {
        struct rb_node *rbp;
@@ -645,10 +661,12 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
        ceph_decode_32_safe(p, end, max, bad);
        while (max--) {
                ceph_decode_need(p, end, 4 + 1 + sizeof(pi->v), bad);
+               err = -ENOMEM;
                pi = kzalloc(sizeof(*pi), GFP_NOFS);
                if (!pi)
                        goto bad;
                pi->id = ceph_decode_32(p);
+               err = -EINVAL;
                ev = ceph_decode_8(p); /* encoding version */
                if (ev > CEPH_PG_POOL_VERSION) {
                        pr_warning("got unknown v %d > %d of ceph_pg_pool\n",
@@ -664,8 +682,13 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
                __insert_pg_pool(&map->pg_pools, pi);
        }
 
-       if (version >= 5 && __decode_pool_names(p, end, map) < 0)
-               goto bad;
+       if (version >= 5) {
+               err = __decode_pool_names(p, end, map);
+               if (err < 0) {
+                       dout("fail to decode pool names");
+                       goto bad;
+               }
+       }
 
        ceph_decode_32_safe(p, end, map->pool_max, bad);
 
@@ -745,7 +768,7 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
        return map;
 
 bad:
-       dout("osdmap_decode fail\n");
+       dout("osdmap_decode fail err %d\n", err);
        ceph_osdmap_destroy(map);
        return ERR_PTR(err);
 }
@@ -839,6 +862,7 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
                if (ev > CEPH_PG_POOL_VERSION) {
                        pr_warning("got unknown v %d > %d of ceph_pg_pool\n",
                                   ev, CEPH_PG_POOL_VERSION);
+                       err = -EINVAL;
                        goto bad;
                }
                pi = __lookup_pg_pool(&map->pg_pools, pool);
@@ -855,8 +879,11 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
                if (err < 0)
                        goto bad;
        }
-       if (version >= 5 && __decode_pool_names(p, end, map) < 0)
-               goto bad;
+       if (version >= 5) {
+               err = __decode_pool_names(p, end, map);
+               if (err < 0)
+                       goto bad;
+       }
 
        /* old_pool */
        ceph_decode_32_safe(p, end, len, bad);
@@ -932,15 +959,13 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
                        (void) __remove_pg_mapping(&map->pg_temp, pgid);
 
                        /* insert */
-                       if (pglen > (UINT_MAX - sizeof(*pg)) / sizeof(u32)) {
-                               err = -EINVAL;
+                       err = -EINVAL;
+                       if (pglen > (UINT_MAX - sizeof(*pg)) / sizeof(u32))
                                goto bad;
-                       }
+                       err = -ENOMEM;
                        pg = kmalloc(sizeof(*pg) + sizeof(u32)*pglen, GFP_NOFS);
-                       if (!pg) {
-                               err = -ENOMEM;
+                       if (!pg)
                                goto bad;
-                       }
                        pg->pgid = pgid;
                        pg->len = pglen;
                        for (j = 0; j < pglen; j++)