Skip to content

Commit

Permalink
libceph: move ceph_con_send() closed check under the con mutex
Browse files Browse the repository at this point in the history
Take the con mutex before checking whether the connection is closed to
avoid racing with someone else closing it.

Signed-off-by: Sage Weil <sage@inktank.com>
  • Loading branch information
Sage Weil committed Jul 31, 2012
1 parent 0065093 commit a59b55a
Showing 1 changed file with 7 additions and 9 deletions.
16 changes: 7 additions & 9 deletions net/ceph/messenger.c
Original file line number Diff line number Diff line change
Expand Up @@ -2453,22 +2453,20 @@ static void clear_standby(struct ceph_connection *con)
*/
void ceph_con_send(struct ceph_connection *con, struct ceph_msg *msg)
{
if (test_bit(CLOSED, &con->state)) {
dout("con_send %p closed, dropping %p\n", con, msg);
ceph_msg_put(msg);
return;
}

/* set src+dst */
msg->hdr.src = con->msgr->inst.name;

BUG_ON(msg->front.iov_len != le32_to_cpu(msg->hdr.front_len));

msg->needs_out_seq = true;

/* queue */
mutex_lock(&con->mutex);

if (test_bit(CLOSED, &con->state)) {
dout("con_send %p closed, dropping %p\n", con, msg);
ceph_msg_put(msg);
mutex_unlock(&con->mutex);
return;
}

BUG_ON(msg->con != NULL);
msg->con = con->ops->get(con);
BUG_ON(msg->con == NULL);
Expand Down

0 comments on commit a59b55a

Please sign in to comment.