From 2d9180e2c9166ae1c7b717e36e271cac146f1a3e Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 30 Jul 2012 16:24:37 -0700 Subject: [PATCH] --- yaml --- r: 320330 b: refs/heads/master c: 8c50c817566dfa4581f82373aac39f3e608a7dc8 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/net/ceph/messenger.c | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 36bbc78b03dd..fee4db24efdb 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3a140a0d5c4b9e35373b016e41dfc85f1e526bdb +refs/heads/master: 8c50c817566dfa4581f82373aac39f3e608a7dc8 diff --git a/trunk/net/ceph/messenger.c b/trunk/net/ceph/messenger.c index 6e2f67816f61..e65b15d5d8b9 100644 --- a/trunk/net/ceph/messenger.c +++ b/trunk/net/ceph/messenger.c @@ -503,6 +503,7 @@ static void reset_connection(struct ceph_connection *con) */ void ceph_con_close(struct ceph_connection *con) { + mutex_lock(&con->mutex); dout("con_close %p peer %s\n", con, ceph_pr_addr(&con->peer_addr.in_addr)); clear_bit(NEGOTIATING, &con->state); @@ -515,11 +516,16 @@ void ceph_con_close(struct ceph_connection *con) clear_bit(KEEPALIVE_PENDING, &con->flags); clear_bit(WRITE_PENDING, &con->flags); - mutex_lock(&con->mutex); reset_connection(con); con->peer_global_seq = 0; cancel_delayed_work(&con->work); mutex_unlock(&con->mutex); + + /* + * We cannot close the socket directly from here because the + * work threads use it without holding the mutex. Instead, let + * con_work() do it. + */ queue_con(con); } EXPORT_SYMBOL(ceph_con_close);