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>
This commit is contained in:
Родитель
7b862e07b1
Коммит
8636ea672f
|
@ -2336,7 +2336,6 @@ done_unlocked:
|
|||
return;
|
||||
|
||||
fault:
|
||||
mutex_unlock(&con->mutex);
|
||||
ceph_fault(con); /* error/fault path */
|
||||
goto done_unlocked;
|
||||
}
|
||||
|
@ -2347,9 +2346,8 @@ fault:
|
|||
* exponential backoff
|
||||
*/
|
||||
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),
|
||||
ceph_pr_addr(&con->peer_addr.in_addr), con->error_msg);
|
||||
dout("fault %p state %lu to peer %s\n",
|
||||
|
|
Загрузка…
Ссылка в новой задаче