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>hifive-unleashed-5.1
parent
7b862e07b1
commit
8636ea672f
|
@ -2336,7 +2336,6 @@ done_unlocked:
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fault:
|
fault:
|
||||||
mutex_unlock(&con->mutex);
|
|
||||||
ceph_fault(con); /* error/fault path */
|
ceph_fault(con); /* error/fault path */
|
||||||
goto done_unlocked;
|
goto done_unlocked;
|
||||||
}
|
}
|
||||||
|
@ -2347,9 +2346,8 @@ fault:
|
||||||
* exponential backoff
|
* exponential backoff
|
||||||
*/
|
*/
|
||||||
static void ceph_fault(struct ceph_connection *con)
|
static void ceph_fault(struct ceph_connection *con)
|
||||||
|
__releases(con->mutex)
|
||||||
{
|
{
|
||||||
mutex_lock(&con->mutex);
|
|
||||||
|
|
||||||
pr_err("%s%lld %s %s\n", ENTITY_NAME(con->peer_name),
|
pr_err("%s%lld %s %s\n", ENTITY_NAME(con->peer_name),
|
||||||
ceph_pr_addr(&con->peer_addr.in_addr), con->error_msg);
|
ceph_pr_addr(&con->peer_addr.in_addr), con->error_msg);
|
||||||
dout("fault %p state %lu to peer %s\n",
|
dout("fault %p state %lu to peer %s\n",
|
||||||
|
|
Loading…
Reference in New Issue