diff options
author | Ilya Dryomov <ilya.dryomov@inktank.com> | 2014-03-21 19:05:27 +0200 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2014-04-04 21:07:50 -0700 |
commit | 433fbdd31db267564bab20420bd8f161a7c69e4d (patch) | |
tree | df5ba6f6f6f2c02fc2b1530d2c8150950301cd94 /net/ceph | |
parent | 0f70c7eedbbbd245398fc74b4b020f3b800f071c (diff) | |
download | linux-stable-433fbdd31db267564bab20420bd8f161a7c69e4d.tar.gz linux-stable-433fbdd31db267564bab20420bd8f161a7c69e4d.tar.bz2 linux-stable-433fbdd31db267564bab20420bd8f161a7c69e4d.zip |
libceph: introduce decode{,_new}_pools() and switch to them
Consolidate pools (full map, map<u64, pg_pool_t>) and new_pools (inc
map, same) decoding logic into a common helper and switch to it.
Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com>
Reviewed-by: Alex Elder <elder@linaro.org>
Diffstat (limited to 'net/ceph')
-rw-r--r-- | net/ceph/osdmap.c | 94 |
1 files changed, 57 insertions, 37 deletions
diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c index 39938d79756c..0ba3062d3317 100644 --- a/net/ceph/osdmap.c +++ b/net/ceph/osdmap.c @@ -681,6 +681,55 @@ static int osdmap_set_max_osd(struct ceph_osdmap *map, int max) return 0; } +static int __decode_pools(void **p, void *end, struct ceph_osdmap *map, + bool incremental) +{ + u32 n; + + ceph_decode_32_safe(p, end, n, e_inval); + while (n--) { + struct ceph_pg_pool_info *pi; + u64 pool; + int ret; + + ceph_decode_64_safe(p, end, pool, e_inval); + + pi = __lookup_pg_pool(&map->pg_pools, pool); + if (!incremental || !pi) { + pi = kzalloc(sizeof(*pi), GFP_NOFS); + if (!pi) + return -ENOMEM; + + pi->id = pool; + + ret = __insert_pg_pool(&map->pg_pools, pi); + if (ret) { + kfree(pi); + return ret; + } + } + + ret = decode_pool(p, end, pi); + if (ret) + return ret; + } + + return 0; + +e_inval: + return -EINVAL; +} + +static int decode_pools(void **p, void *end, struct ceph_osdmap *map) +{ + return __decode_pools(p, end, map, false); +} + +static int decode_new_pools(void **p, void *end, struct ceph_osdmap *map) +{ + return __decode_pools(p, end, map, true); +} + /* * decode a full map. */ @@ -692,7 +741,6 @@ static int osdmap_decode(void **p, void *end, struct ceph_osdmap *map) u32 max; u32 len, i; int err; - struct ceph_pg_pool_info *pi; dout("%s %p to %p len %d\n", __func__, *p, end, (int)(end - *p)); @@ -714,22 +762,10 @@ static int osdmap_decode(void **p, void *end, struct ceph_osdmap *map) ceph_decode_copy(p, &map->created, sizeof(map->created)); ceph_decode_copy(p, &map->modified, sizeof(map->modified)); - ceph_decode_32_safe(p, end, max, e_inval); - while (max--) { - ceph_decode_need(p, end, 8 + 2, e_inval); - pi = kzalloc(sizeof(*pi), GFP_NOFS); - if (!pi) { - err = -ENOMEM; - goto bad; - } - pi->id = ceph_decode_64(p); - err = decode_pool(p, end, pi); - if (err < 0) { - kfree(pi); - goto bad; - } - __insert_pg_pool(&map->pg_pools, pi); - } + /* pools */ + err = decode_pools(p, end, map); + if (err) + goto bad; /* pool_name */ err = decode_pool_names(p, end, map); @@ -934,26 +970,10 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, newcrush = NULL; } - /* new_pool */ - ceph_decode_32_safe(p, end, len, e_inval); - while (len--) { - struct ceph_pg_pool_info *pi; - - ceph_decode_64_safe(p, end, pool, e_inval); - pi = __lookup_pg_pool(&map->pg_pools, pool); - if (!pi) { - pi = kzalloc(sizeof(*pi), GFP_NOFS); - if (!pi) { - err = -ENOMEM; - goto bad; - } - pi->id = pool; - __insert_pg_pool(&map->pg_pools, pi); - } - err = decode_pool(p, end, pi); - if (err < 0) - goto bad; - } + /* new_pools */ + err = decode_new_pools(p, end, map); + if (err) + goto bad; /* new_pool_names */ err = decode_pool_names(p, end, map); |