From fc74337ce07a141f9e7209551f44c49dc988f637 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 30 Apr 2008 19:34:45 -0700 Subject: [PATCH] kclient: fixed some bugs in messenger shutdown --- src/config.cc | 4 ++-- src/kernel/ktcp.c | 6 +++++- src/kernel/ktcp.h | 1 + src/kernel/mds_client.c | 1 + src/kernel/messenger.c | 17 +++++++++++++---- 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/config.cc b/src/config.cc index 0c33aa68da343..7627bde52e5cd 100644 --- a/src/config.cc +++ b/src/config.cc @@ -283,9 +283,9 @@ md_config_t g_conf = { mds_beacon_interval: 4, //30.0, mds_beacon_grace: 15, //60*60.0, - mds_cap_timeout: 100, // cap bits time out if client idle + mds_cap_timeout: 100, // cap bits time out if client idle mds_session_autoclose: 300, // autoclose idle session - mds_client_lease: 30, + mds_client_lease: 100, mds_tick_interval: 5, diff --git a/src/kernel/ktcp.c b/src/kernel/ktcp.c index 5220025ba0d20..5698196501023 100644 --- a/src/kernel/ktcp.c +++ b/src/kernel/ktcp.c @@ -107,7 +107,7 @@ static void set_sock_callbacks(struct socket *sock, struct ceph_connection *con) sk->sk_state_change = ceph_state_change; } -void ceph_sock_release(struct socket *sock) +void ceph_cancel_sock_callbacks(struct socket *sock) { struct sock *sk; if (!sock) @@ -117,6 +117,10 @@ void ceph_sock_release(struct socket *sock) sk->sk_data_ready = 0; sk->sk_write_space = 0; sk->sk_state_change = 0; +} +void ceph_sock_release(struct socket *sock) +{ + ceph_cancel_sock_callbacks(sock); sock_release(sock); } diff --git a/src/kernel/ktcp.h b/src/kernel/ktcp.h index a783a6e8a385a..ff5115311c41a 100644 --- a/src/kernel/ktcp.h +++ b/src/kernel/ktcp.h @@ -10,6 +10,7 @@ int ceph_tcp_listen(struct ceph_messenger *); int ceph_tcp_accept(struct socket *, struct ceph_connection *); int ceph_tcp_recvmsg(struct socket *, void *, size_t ); int ceph_tcp_sendmsg(struct socket *, struct kvec *, size_t, size_t, int more); +void ceph_cancel_sock_callbacks(struct socket *); void ceph_sock_release(struct socket *); int ceph_workqueue_init(void); void ceph_workqueue_shutdown(void); diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index 4aa398bda7081..91ebeb26561bd 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -1553,6 +1553,7 @@ static void flush_write_caps(struct ceph_mds_client *mdsc, } used = __ceph_caps_used(cap->ci); wanted = __ceph_caps_wanted(cap->ci); + /* FIXME: this drops s_mutex, which we dont want, ugh */ __ceph_mdsc_send_cap(mdsc, session, cap, used, wanted, 0); } } diff --git a/src/kernel/messenger.c b/src/kernel/messenger.c index 1ce8b8a8b4a3f..521911e6ead2c 100644 --- a/src/kernel/messenger.c +++ b/src/kernel/messenger.c @@ -1325,7 +1325,15 @@ void ceph_messenger_destroy(struct ceph_messenger *msgr) { struct ceph_connection *con; + ceph_debug_msgr = 50; + ceph_debug_console = 1; + dout(2, "destroy %p\n", msgr); + + /* stop listener */ + ceph_cancel_sock_callbacks(msgr->listen_sock); + cancel_work_sync(&msgr->awork); + ceph_sock_release(msgr->listen_sock); /* kill off connections */ spin_lock(&msgr->con_lock); @@ -1339,21 +1347,22 @@ void ceph_messenger_destroy(struct ceph_messenger *msgr) /* in case there's queued work... */ spin_unlock(&msgr->con_lock); + ceph_cancel_sock_callbacks(con->sock); cancel_work_sync(&con->rwork); cancel_delayed_work_sync(&con->swork); put_connection(con); + dout(10, "destroy removed connection %p\n", con); + spin_lock(&msgr->con_lock); } spin_unlock(&msgr->con_lock); - /* stop listener */ - ceph_sock_release(msgr->listen_sock); - cancel_work_sync(&msgr->awork); - kunmap(msgr->zero_page); __free_page(msgr->zero_page); kfree(msgr); + + dout(10, "destroyed messenger %p\n", msgr); } /* -- 2.39.5