libceph: osd_init() and osd_cleanup()
These are going to be used by homeless OSD sessions code. Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
42c1b12403
commit
0247a0cf3e
1 changed files with 37 additions and 9 deletions
|
@ -864,6 +864,11 @@ EXPORT_SYMBOL(ceph_osdc_new_request);
|
||||||
*/
|
*/
|
||||||
DEFINE_RB_FUNCS(request, struct ceph_osd_request, r_tid, r_node)
|
DEFINE_RB_FUNCS(request, struct ceph_osd_request, r_tid, r_node)
|
||||||
|
|
||||||
|
static bool osd_homeless(struct ceph_osd *osd)
|
||||||
|
{
|
||||||
|
return osd->o_osd == CEPH_HOMELESS_OSD;
|
||||||
|
}
|
||||||
|
|
||||||
static struct ceph_osd_request *
|
static struct ceph_osd_request *
|
||||||
__lookup_request_ge(struct ceph_osd_client *osdc,
|
__lookup_request_ge(struct ceph_osd_client *osdc,
|
||||||
u64 tid)
|
u64 tid)
|
||||||
|
@ -1001,6 +1006,34 @@ static void osd_reset(struct ceph_connection *con)
|
||||||
up_read(&osdc->map_sem);
|
up_read(&osdc->map_sem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Assumes @osd is zero-initialized.
|
||||||
|
*/
|
||||||
|
static void osd_init(struct ceph_osd *osd)
|
||||||
|
{
|
||||||
|
atomic_set(&osd->o_ref, 1);
|
||||||
|
RB_CLEAR_NODE(&osd->o_node);
|
||||||
|
INIT_LIST_HEAD(&osd->o_requests);
|
||||||
|
INIT_LIST_HEAD(&osd->o_linger_requests);
|
||||||
|
INIT_LIST_HEAD(&osd->o_osd_lru);
|
||||||
|
INIT_LIST_HEAD(&osd->o_keepalive_item);
|
||||||
|
osd->o_incarnation = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void osd_cleanup(struct ceph_osd *osd)
|
||||||
|
{
|
||||||
|
WARN_ON(!RB_EMPTY_NODE(&osd->o_node));
|
||||||
|
WARN_ON(!list_empty(&osd->o_requests));
|
||||||
|
WARN_ON(!list_empty(&osd->o_linger_requests));
|
||||||
|
WARN_ON(!list_empty(&osd->o_osd_lru));
|
||||||
|
WARN_ON(!list_empty(&osd->o_keepalive_item));
|
||||||
|
|
||||||
|
if (osd->o_auth.authorizer) {
|
||||||
|
WARN_ON(osd_homeless(osd));
|
||||||
|
ceph_auth_destroy_authorizer(osd->o_auth.authorizer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Track open sessions with osds.
|
* Track open sessions with osds.
|
||||||
*/
|
*/
|
||||||
|
@ -1008,22 +1041,18 @@ static struct ceph_osd *create_osd(struct ceph_osd_client *osdc, int onum)
|
||||||
{
|
{
|
||||||
struct ceph_osd *osd;
|
struct ceph_osd *osd;
|
||||||
|
|
||||||
|
WARN_ON(onum == CEPH_HOMELESS_OSD);
|
||||||
|
|
||||||
osd = kzalloc(sizeof(*osd), GFP_NOFS);
|
osd = kzalloc(sizeof(*osd), GFP_NOFS);
|
||||||
if (!osd)
|
if (!osd)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
atomic_set(&osd->o_ref, 1);
|
osd_init(osd);
|
||||||
osd->o_osdc = osdc;
|
osd->o_osdc = osdc;
|
||||||
osd->o_osd = onum;
|
osd->o_osd = onum;
|
||||||
RB_CLEAR_NODE(&osd->o_node);
|
|
||||||
INIT_LIST_HEAD(&osd->o_requests);
|
|
||||||
INIT_LIST_HEAD(&osd->o_linger_requests);
|
|
||||||
INIT_LIST_HEAD(&osd->o_osd_lru);
|
|
||||||
osd->o_incarnation = 1;
|
|
||||||
|
|
||||||
ceph_con_init(&osd->o_con, osd, &osd_con_ops, &osdc->client->msgr);
|
ceph_con_init(&osd->o_con, osd, &osd_con_ops, &osdc->client->msgr);
|
||||||
|
|
||||||
INIT_LIST_HEAD(&osd->o_keepalive_item);
|
|
||||||
return osd;
|
return osd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1044,8 +1073,7 @@ static void put_osd(struct ceph_osd *osd)
|
||||||
dout("put_osd %p %d -> %d\n", osd, atomic_read(&osd->o_ref),
|
dout("put_osd %p %d -> %d\n", osd, atomic_read(&osd->o_ref),
|
||||||
atomic_read(&osd->o_ref) - 1);
|
atomic_read(&osd->o_ref) - 1);
|
||||||
if (atomic_dec_and_test(&osd->o_ref)) {
|
if (atomic_dec_and_test(&osd->o_ref)) {
|
||||||
if (osd->o_auth.authorizer)
|
osd_cleanup(osd);
|
||||||
ceph_auth_destroy_authorizer(osd->o_auth.authorizer);
|
|
||||||
kfree(osd);
|
kfree(osd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue