Skip to content

Commit

Permalink
libceph: fix mutex coverage for ceph_con_close
Browse files Browse the repository at this point in the history
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: Sage Weil <sage@inktank.com>
Reviewed-by: Alex Elder <elder@inktank.com>
Reviewed-by: Yehuda Sadeh <yehuda@inktank.com>
  • Loading branch information
Sage Weil committed Jul 31, 2012
1 parent 3a140a0 commit 8c50c81
Showing 1 changed file with 7 additions and 1 deletion.
8 changes: 7 additions & 1 deletion net/ceph/messenger.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down

0 comments on commit 8c50c81

Please sign in to comment.