Commit e5253a7b authored by Ilya Dryomov's avatar Ilya Dryomov

libceph: allocate dummy osdmap in ceph_osdc_init()

This leads to a simpler osdmap handling code, particularly when dealing
with pi->was_full, which is introduced in a later commit.
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent fbca9635
...@@ -225,6 +225,7 @@ static inline int ceph_decode_pgid(void **p, void *end, struct ceph_pg *pgid) ...@@ -225,6 +225,7 @@ static inline int ceph_decode_pgid(void **p, void *end, struct ceph_pg *pgid)
return 0; return 0;
} }
struct ceph_osdmap *ceph_osdmap_alloc(void);
extern struct ceph_osdmap *ceph_osdmap_decode(void **p, void *end); extern struct ceph_osdmap *ceph_osdmap_decode(void **p, void *end);
struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
struct ceph_osdmap *map); struct ceph_osdmap *map);
......
...@@ -2255,7 +2255,7 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) ...@@ -2255,7 +2255,7 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
struct ceph_fsid fsid; struct ceph_fsid fsid;
bool was_full; bool was_full;
dout("handle_map have %u\n", osdc->osdmap ? osdc->osdmap->epoch : 0); dout("handle_map have %u\n", osdc->osdmap->epoch);
p = msg->front.iov_base; p = msg->front.iov_base;
end = p + msg->front.iov_len; end = p + msg->front.iov_len;
...@@ -2278,7 +2278,7 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) ...@@ -2278,7 +2278,7 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
maplen = ceph_decode_32(&p); maplen = ceph_decode_32(&p);
ceph_decode_need(&p, end, maplen, bad); ceph_decode_need(&p, end, maplen, bad);
next = p + maplen; next = p + maplen;
if (osdc->osdmap && osdc->osdmap->epoch+1 == epoch) { if (osdc->osdmap->epoch+1 == epoch) {
dout("applying incremental map %u len %d\n", dout("applying incremental map %u len %d\n",
epoch, maplen); epoch, maplen);
newmap = osdmap_apply_incremental(&p, next, newmap = osdmap_apply_incremental(&p, next,
...@@ -2317,7 +2317,7 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) ...@@ -2317,7 +2317,7 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
if (nr_maps > 1) { if (nr_maps > 1) {
dout("skipping non-latest full map %u len %d\n", dout("skipping non-latest full map %u len %d\n",
epoch, maplen); epoch, maplen);
} else if (osdc->osdmap && osdc->osdmap->epoch >= epoch) { } else if (osdc->osdmap->epoch >= epoch) {
dout("skipping full map %u len %d, " dout("skipping full map %u len %d, "
"older than our %u\n", epoch, maplen, "older than our %u\n", epoch, maplen,
osdc->osdmap->epoch); osdc->osdmap->epoch);
...@@ -2347,8 +2347,6 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) ...@@ -2347,8 +2347,6 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
nr_maps--; nr_maps--;
} }
if (!osdc->osdmap)
goto bad;
done: done:
downgrade_write(&osdc->map_sem); downgrade_write(&osdc->map_sem);
ceph_monc_got_map(&osdc->client->monc, CEPH_SUB_OSDMAP, ceph_monc_got_map(&osdc->client->monc, CEPH_SUB_OSDMAP,
...@@ -2690,7 +2688,6 @@ int ceph_osdc_init(struct ceph_osd_client *osdc, struct ceph_client *client) ...@@ -2690,7 +2688,6 @@ int ceph_osdc_init(struct ceph_osd_client *osdc, struct ceph_client *client)
dout("init\n"); dout("init\n");
osdc->client = client; osdc->client = client;
osdc->osdmap = NULL;
init_rwsem(&osdc->map_sem); init_rwsem(&osdc->map_sem);
mutex_init(&osdc->request_mutex); mutex_init(&osdc->request_mutex);
osdc->last_tid = 0; osdc->last_tid = 0;
...@@ -2709,10 +2706,14 @@ int ceph_osdc_init(struct ceph_osd_client *osdc, struct ceph_client *client) ...@@ -2709,10 +2706,14 @@ int ceph_osdc_init(struct ceph_osd_client *osdc, struct ceph_client *client)
osdc->event_count = 0; osdc->event_count = 0;
err = -ENOMEM; err = -ENOMEM;
osdc->osdmap = ceph_osdmap_alloc();
if (!osdc->osdmap)
goto out;
osdc->req_mempool = mempool_create_slab_pool(10, osdc->req_mempool = mempool_create_slab_pool(10,
ceph_osd_request_cache); ceph_osd_request_cache);
if (!osdc->req_mempool) if (!osdc->req_mempool)
goto out; goto out_map;
err = ceph_msgpool_init(&osdc->msgpool_op, CEPH_MSG_OSD_OP, err = ceph_msgpool_init(&osdc->msgpool_op, CEPH_MSG_OSD_OP,
PAGE_SIZE, 10, true, "osd_op"); PAGE_SIZE, 10, true, "osd_op");
...@@ -2741,6 +2742,8 @@ int ceph_osdc_init(struct ceph_osd_client *osdc, struct ceph_client *client) ...@@ -2741,6 +2742,8 @@ int ceph_osdc_init(struct ceph_osd_client *osdc, struct ceph_client *client)
ceph_msgpool_destroy(&osdc->msgpool_op); ceph_msgpool_destroy(&osdc->msgpool_op);
out_mempool: out_mempool:
mempool_destroy(osdc->req_mempool); mempool_destroy(osdc->req_mempool);
out_map:
ceph_osdmap_destroy(osdc->osdmap);
out: out:
return err; return err;
} }
...@@ -2760,10 +2763,7 @@ void ceph_osdc_stop(struct ceph_osd_client *osdc) ...@@ -2760,10 +2763,7 @@ void ceph_osdc_stop(struct ceph_osd_client *osdc)
} }
mutex_unlock(&osdc->request_mutex); mutex_unlock(&osdc->request_mutex);
if (osdc->osdmap) { ceph_osdmap_destroy(osdc->osdmap);
ceph_osdmap_destroy(osdc->osdmap);
osdc->osdmap = NULL;
}
mempool_destroy(osdc->req_mempool); mempool_destroy(osdc->req_mempool);
ceph_msgpool_destroy(&osdc->msgpool_op); ceph_msgpool_destroy(&osdc->msgpool_op);
ceph_msgpool_destroy(&osdc->msgpool_op_reply); ceph_msgpool_destroy(&osdc->msgpool_op_reply);
......
...@@ -707,6 +707,23 @@ static int decode_pool_names(void **p, void *end, struct ceph_osdmap *map) ...@@ -707,6 +707,23 @@ static int decode_pool_names(void **p, void *end, struct ceph_osdmap *map)
/* /*
* osd map * osd map
*/ */
struct ceph_osdmap *ceph_osdmap_alloc(void)
{
struct ceph_osdmap *map;
map = kzalloc(sizeof(*map), GFP_NOIO);
if (!map)
return NULL;
map->pg_pools = RB_ROOT;
map->pool_max = -1;
map->pg_temp = RB_ROOT;
map->primary_temp = RB_ROOT;
mutex_init(&map->crush_scratch_mutex);
return map;
}
void ceph_osdmap_destroy(struct ceph_osdmap *map) void ceph_osdmap_destroy(struct ceph_osdmap *map)
{ {
dout("osdmap_destroy %p\n", map); dout("osdmap_destroy %p\n", map);
...@@ -1230,14 +1247,10 @@ struct ceph_osdmap *ceph_osdmap_decode(void **p, void *end) ...@@ -1230,14 +1247,10 @@ struct ceph_osdmap *ceph_osdmap_decode(void **p, void *end)
struct ceph_osdmap *map; struct ceph_osdmap *map;
int ret; int ret;
map = kzalloc(sizeof(*map), GFP_NOFS); map = ceph_osdmap_alloc();
if (!map) if (!map)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
map->pg_temp = RB_ROOT;
map->primary_temp = RB_ROOT;
mutex_init(&map->crush_scratch_mutex);
ret = osdmap_decode(p, end, map); ret = osdmap_decode(p, end, map);
if (ret) { if (ret) {
ceph_osdmap_destroy(map); ceph_osdmap_destroy(map);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment