mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 21:54:11 +08:00
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: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
fbca963532
commit
e5253a7bde
@ -225,6 +225,7 @@ static inline int ceph_decode_pgid(void **p, void *end, struct ceph_pg *pgid)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct ceph_osdmap *ceph_osdmap_alloc(void);
|
||||
extern struct ceph_osdmap *ceph_osdmap_decode(void **p, void *end);
|
||||
struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
|
||||
struct ceph_osdmap *map);
|
||||
|
@ -2255,7 +2255,7 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
|
||||
struct ceph_fsid fsid;
|
||||
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;
|
||||
end = p + msg->front.iov_len;
|
||||
|
||||
@ -2278,7 +2278,7 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
|
||||
maplen = ceph_decode_32(&p);
|
||||
ceph_decode_need(&p, end, maplen, bad);
|
||||
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",
|
||||
epoch, maplen);
|
||||
newmap = osdmap_apply_incremental(&p, next,
|
||||
@ -2317,7 +2317,7 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
|
||||
if (nr_maps > 1) {
|
||||
dout("skipping non-latest full map %u len %d\n",
|
||||
epoch, maplen);
|
||||
} else if (osdc->osdmap && osdc->osdmap->epoch >= epoch) {
|
||||
} else if (osdc->osdmap->epoch >= epoch) {
|
||||
dout("skipping full map %u len %d, "
|
||||
"older than our %u\n", epoch, maplen,
|
||||
osdc->osdmap->epoch);
|
||||
@ -2347,8 +2347,6 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
|
||||
nr_maps--;
|
||||
}
|
||||
|
||||
if (!osdc->osdmap)
|
||||
goto bad;
|
||||
done:
|
||||
downgrade_write(&osdc->map_sem);
|
||||
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)
|
||||
|
||||
dout("init\n");
|
||||
osdc->client = client;
|
||||
osdc->osdmap = NULL;
|
||||
init_rwsem(&osdc->map_sem);
|
||||
mutex_init(&osdc->request_mutex);
|
||||
osdc->last_tid = 0;
|
||||
@ -2709,10 +2706,14 @@ int ceph_osdc_init(struct ceph_osd_client *osdc, struct ceph_client *client)
|
||||
osdc->event_count = 0;
|
||||
|
||||
err = -ENOMEM;
|
||||
osdc->osdmap = ceph_osdmap_alloc();
|
||||
if (!osdc->osdmap)
|
||||
goto out;
|
||||
|
||||
osdc->req_mempool = mempool_create_slab_pool(10,
|
||||
ceph_osd_request_cache);
|
||||
if (!osdc->req_mempool)
|
||||
goto out;
|
||||
goto out_map;
|
||||
|
||||
err = ceph_msgpool_init(&osdc->msgpool_op, CEPH_MSG_OSD_OP,
|
||||
PAGE_SIZE, 10, true, "osd_op");
|
||||
@ -2741,6 +2742,8 @@ out_msgpool:
|
||||
ceph_msgpool_destroy(&osdc->msgpool_op);
|
||||
out_mempool:
|
||||
mempool_destroy(osdc->req_mempool);
|
||||
out_map:
|
||||
ceph_osdmap_destroy(osdc->osdmap);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
@ -2760,10 +2763,7 @@ void ceph_osdc_stop(struct ceph_osd_client *osdc)
|
||||
}
|
||||
mutex_unlock(&osdc->request_mutex);
|
||||
|
||||
if (osdc->osdmap) {
|
||||
ceph_osdmap_destroy(osdc->osdmap);
|
||||
osdc->osdmap = NULL;
|
||||
}
|
||||
ceph_osdmap_destroy(osdc->osdmap);
|
||||
mempool_destroy(osdc->req_mempool);
|
||||
ceph_msgpool_destroy(&osdc->msgpool_op);
|
||||
ceph_msgpool_destroy(&osdc->msgpool_op_reply);
|
||||
|
@ -707,6 +707,23 @@ bad:
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
dout("osdmap_destroy %p\n", map);
|
||||
@ -1230,14 +1247,10 @@ struct ceph_osdmap *ceph_osdmap_decode(void **p, void *end)
|
||||
struct ceph_osdmap *map;
|
||||
int ret;
|
||||
|
||||
map = kzalloc(sizeof(*map), GFP_NOFS);
|
||||
map = ceph_osdmap_alloc();
|
||||
if (!map)
|
||||
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);
|
||||
if (ret) {
|
||||
ceph_osdmap_destroy(map);
|
||||
|
Loading…
Reference in New Issue
Block a user