From 3309f9850b7dedf0b5dce5f60e338bbafb1a8e72 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 3 Sep 2009 14:36:17 -0700 Subject: [PATCH] kclient: simplify con_open/close interface a bit No more 'reopen' hackery. --- src/kernel/mds_client.c | 10 +++++----- src/kernel/messenger.c | 24 ++++++++++-------------- src/kernel/messenger.h | 11 +++++------ src/kernel/mon_client.c | 5 +++-- src/kernel/osd_client.c | 4 ++-- 5 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index e41eb71cf156b..88257637502d0 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -275,7 +275,7 @@ void ceph_put_mds_session(struct ceph_mds_session *s) dout("mdsc put_session %p %d -> %d\n", s, atomic_read(&s->s_ref), atomic_read(&s->s_ref)-1); if (atomic_dec_and_test(&s->s_ref)) { - ceph_con_destroy(&s->s_con); + ceph_con_shutdown(&s->s_con); kfree(s); } } @@ -321,12 +321,12 @@ static struct ceph_mds_session *register_session(struct ceph_mds_client *mdsc, s->s_seq = 0; mutex_init(&s->s_mutex); - ceph_con_init(mdsc->client->msgr, &s->s_con, - ceph_mdsmap_get_addr(mdsc->mdsmap, mds)); + ceph_con_init(mdsc->client->msgr, &s->s_con); s->s_con.private = s; s->s_con.ops = &mds_con_ops; s->s_con.peer_name.type = cpu_to_le32(CEPH_ENTITY_TYPE_MDS); s->s_con.peer_name.num = cpu_to_le32(mds); + ceph_con_open(&s->s_con, ceph_mdsmap_get_addr(mdsc->mdsmap, mds)); spin_lock_init(&s->s_cap_lock); s->s_cap_gen = 0; @@ -2050,8 +2050,8 @@ static void send_mds_reconnect(struct ceph_mds_client *mdsc, int mds) session->s_state = CEPH_MDS_SESSION_RECONNECTING; session->s_seq = 0; - ceph_con_reopen(&session->s_con, - ceph_mdsmap_get_addr(mdsc->mdsmap, mds)); + ceph_con_open(&session->s_con, + ceph_mdsmap_get_addr(mdsc->mdsmap, mds)); /* replay unsafe requests */ replay_unsafe_requests(mdsc, session); diff --git a/src/kernel/messenger.c b/src/kernel/messenger.c index e1c95290b70fa..3f3ae7810b114 100644 --- a/src/kernel/messenger.c +++ b/src/kernel/messenger.c @@ -266,9 +266,9 @@ void ceph_con_close(struct ceph_connection *con) /* * clean up connection state */ -void ceph_con_destroy(struct ceph_connection *con) +void ceph_con_shutdown(struct ceph_connection *con) { - dout("con_destroy %p destroying\n", con); + dout("con_shutdown %p\n", con); reset_connection(con); set_bit(DEAD, &con->state); con_close_socket(con); /* silently ignore errors */ @@ -277,11 +277,10 @@ void ceph_con_destroy(struct ceph_connection *con) /* * Reopen a closed connection, with a new peer address. */ -void ceph_con_reopen(struct ceph_connection *con, struct ceph_entity_addr *addr) +void ceph_con_open(struct ceph_connection *con, struct ceph_entity_addr *addr) { - dout("con_reopen %p %u.%u.%u.%u:%u\n", con, IPQUADPORT(addr->ipaddr)); - BUG_ON(!test_bit(CLOSED, &con->state)); - set_bit(REOPEN, &con->state); + dout("con_open %p %u.%u.%u.%u:%u\n", con, IPQUADPORT(addr->ipaddr)); + set_bit(OPENING, &con->state); clear_bit(CLOSED, &con->state); memcpy(&con->peer_addr, addr, sizeof(*addr)); queue_con(con); @@ -305,7 +304,7 @@ void ceph_con_put(struct ceph_connection *con) atomic_read(&con->nref), atomic_read(&con->nref) - 1); BUG_ON(atomic_read(&con->nref) == 0); if (atomic_dec_and_test(&con->nref)) { - ceph_con_destroy(con); + ceph_con_shutdown(con); kfree(con); } } @@ -315,18 +314,15 @@ void ceph_con_put(struct ceph_connection *con) * * NOTE: assumes struct is initially zeroed! */ -void ceph_con_init(struct ceph_messenger *msgr, struct ceph_connection *con, - struct ceph_entity_addr *addr) +void ceph_con_init(struct ceph_messenger *msgr, struct ceph_connection *con) { - dout("con_init %p %u.%u.%u.%u:%u\n", con, IPQUADPORT(addr->ipaddr)); + dout("con_init %p\n", con); atomic_set(&con->nref, 1); con->msgr = msgr; spin_lock_init(&con->out_queue_lock); INIT_LIST_HEAD(&con->out_queue); INIT_LIST_HEAD(&con->out_sent); INIT_DELAYED_WORK(&con->work, con_work); - con->peer_addr = *addr; - con->private = NULL; } @@ -1455,9 +1451,9 @@ more: con_close_socket(con); goto done; } - if (test_and_clear_bit(REOPEN, &con->state)) { + if (test_and_clear_bit(OPENING, &con->state)) { /* reopen w/ new peer */ - dout("con_work REOPEN\n"); + dout("con_work OPENING\n"); con_close_socket(con); } if (test_bit(WAIT, &con->state)) { /* we are a zombie */ diff --git a/src/kernel/messenger.h b/src/kernel/messenger.h index 37da5637f3daa..8e94bbafe6f25 100644 --- a/src/kernel/messenger.h +++ b/src/kernel/messenger.h @@ -136,7 +136,7 @@ struct ceph_msg_pos { #define CLOSED 10 /* we've closed the connection */ #define SOCK_CLOSED 11 /* socket state changed to closed */ #define REGISTERED 12 /* connection appears in con_tree */ -#define REOPEN 13 /* reopen connection w/ new peer */ +#define OPENING 13 /* open connection w/ (possibly new) peer */ #define DEAD 14 /* dead, about to kfree */ /* @@ -221,14 +221,13 @@ extern struct ceph_messenger *ceph_messenger_create( extern void ceph_messenger_destroy(struct ceph_messenger *); extern void ceph_con_init(struct ceph_messenger *msgr, - struct ceph_connection *con, + struct ceph_connection *con); +extern void ceph_con_shutdown(struct ceph_connection *con); +extern void ceph_con_open(struct ceph_connection *con, struct ceph_entity_addr *addr); -extern void ceph_con_destroy(struct ceph_connection *con); +extern void ceph_con_close(struct ceph_connection *con); extern void ceph_con_send(struct ceph_connection *con, struct ceph_msg *msg); extern void ceph_con_keepalive(struct ceph_connection *con); -extern void ceph_con_close(struct ceph_connection *con); -extern void ceph_con_reopen(struct ceph_connection *con, - struct ceph_entity_addr *addr); extern struct ceph_connection *ceph_con_get(struct ceph_connection *con); extern void ceph_con_put(struct ceph_connection *con); diff --git a/src/kernel/mon_client.c b/src/kernel/mon_client.c index ec2574f0667a2..8987ffa1f47e2 100644 --- a/src/kernel/mon_client.c +++ b/src/kernel/mon_client.c @@ -125,12 +125,13 @@ static int __open_session(struct ceph_mon_client *monc) } dout("open_session mon%d opened\n", monc->cur_mon); - ceph_con_init(monc->client->msgr, monc->con, - &monc->monmap->mon_inst[monc->cur_mon].addr); + ceph_con_init(monc->client->msgr, monc->con); monc->con->private = monc; monc->con->ops = &mon_con_ops; monc->con->peer_name.type = cpu_to_le32(CEPH_ENTITY_TYPE_MON); monc->con->peer_name.num = cpu_to_le32(monc->cur_mon); + ceph_con_open(monc->con, + &monc->monmap->mon_inst[monc->cur_mon].addr); } else { dout("open_session mon%d already open\n", monc->cur_mon); } diff --git a/src/kernel/osd_client.c b/src/kernel/osd_client.c index ed4edac49a758..478922c44af4c 100644 --- a/src/kernel/osd_client.c +++ b/src/kernel/osd_client.c @@ -310,12 +310,12 @@ static int open_osd_session(struct ceph_osd_client *osdc, struct ceph_osd *osd) osd->o_con = kzalloc(sizeof(*osd->o_con), GFP_NOFS); if (!osd->o_con) return -ENOMEM; - ceph_con_init(osdc->client->msgr, osd->o_con, - &osdc->osdmap->osd_addr[o]); + ceph_con_init(osdc->client->msgr, osd->o_con); osd->o_con->private = osd; osd->o_con->ops = &osd_con_ops; osd->o_con->peer_name.type = cpu_to_le32(CEPH_ENTITY_TYPE_OSD); osd->o_con->peer_name.num = cpu_to_le32(o); + ceph_con_open(osd->o_con, &osdc->osdmap->osd_addr[o]); return 0; } -- 2.39.5