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",
                __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);
 
        return map;
 
 bad:
-       dout("osdmap_decode fail\n");
+       dout("osdmap_decode fail err %d\n", err);
        ceph_osdmap_destroy(map);
        return ERR_PTR(err);
 }
                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);
                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);
                        (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++)