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:
Ilya Dryomov 2016-04-28 16:07:25 +02:00
parent 42c1b12403
commit 0247a0cf3e

View file

@ -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);
} }
} }