diff options
author | Sage Weil <sage@inktank.com> | 2012-07-30 21:17:13 -0400 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2012-07-30 21:17:13 -0400 |
commit | 8636ea672f0c5ab7478c42c5b6705ebd1db7eb6a (patch) | |
tree | 9fdb08cf293f181c566c830dadccf8d176ef2184 /net/ceph/messenger.c | |
parent | 7b862e07b1a4d5c963d19027f10ea78085f27f9b (diff) |
libceph: avoid dropping con mutex before fault
The ceph_fault() function takes the con mutex, so we should avoid
dropping it before calling it. This fixes a potential race with
another thread calling ceph_con_close(), or _open(), or similar (we
don't reverify con->state after retaking the lock).
Add annotation so that lockdep realizes we will drop the mutex before
returning.
Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Alex Elder <elder@inktank.com>
Diffstat (limited to 'net/ceph/messenger.c')
-rw-r--r-- | net/ceph/messenger.c | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index feb5a2ac724c..c3b628c76194 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c | |||
@@ -2336,7 +2336,6 @@ done_unlocked: | |||
2336 | return; | 2336 | return; |
2337 | 2337 | ||
2338 | fault: | 2338 | fault: |
2339 | mutex_unlock(&con->mutex); | ||
2340 | ceph_fault(con); /* error/fault path */ | 2339 | ceph_fault(con); /* error/fault path */ |
2341 | goto done_unlocked; | 2340 | goto done_unlocked; |
2342 | } | 2341 | } |
@@ -2347,9 +2346,8 @@ fault: | |||
2347 | * exponential backoff | 2346 | * exponential backoff |
2348 | */ | 2347 | */ |
2349 | static void ceph_fault(struct ceph_connection *con) | 2348 | static void ceph_fault(struct ceph_connection *con) |
2349 | __releases(con->mutex) | ||
2350 | { | 2350 | { |
2351 | mutex_lock(&con->mutex); | ||
2352 | |||
2353 | pr_err("%s%lld %s %s\n", ENTITY_NAME(con->peer_name), | 2351 | pr_err("%s%lld %s %s\n", ENTITY_NAME(con->peer_name), |
2354 | ceph_pr_addr(&con->peer_addr.in_addr), con->error_msg); | 2352 | ceph_pr_addr(&con->peer_addr.in_addr), con->error_msg); |
2355 | dout("fault %p state %lu to peer %s\n", | 2353 | dout("fault %p state %lu to peer %s\n", |