Commit 7621822a authored by Sage Weil's avatar Sage Weil Committed by Greg Kroah-Hartman

libceph: fix mutex coverage for ceph_con_close

(cherry picked from commit 8c50c817)

Hold the mutex while twiddling all of the state bits to avoid possible
races.  While we're here, make not of why we cannot close the socket
directly.
Signed-off-by: default avatarSage Weil <sage@inktank.com>
Reviewed-by: default avatarAlex Elder <elder@inktank.com>
Reviewed-by: default avatarYehuda Sadeh <yehuda@inktank.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b3fd00b7
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment