Patchwork [3.5.yuz,extended,stable] Patch "libceph: avoid dropping con mutex before fault" has been added to staging queue

mail settings
Submitter Herton Ronaldo Krzesinski
Date Nov. 20, 2012, 5:19 p.m.
Message ID <>
Download mbox | patch
Permalink /patch/200474/
State New
Headers show


Herton Ronaldo Krzesinski - Nov. 20, 2012, 5:19 p.m.
This is a note to let you know that I have just added a patch titled

    libceph: avoid dropping con mutex before fault

to the linux-3.5.y-queue branch of the 3.5.yuz extended stable tree 
which can be found at:;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.yuz tree, see



From 505b1fa5525ad34dd62a04d6b8496a26283cbf0d Mon Sep 17 00:00:00 2001
From: Sage Weil <>
Date: Mon, 30 Jul 2012 18:17:13 -0700
Subject: [PATCH 66/78] libceph: avoid dropping con mutex before fault

commit 8636ea672f0c5ab7478c42c5b6705ebd1db7eb6a upstream.

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

Signed-off-by: Sage Weil <>
Reviewed-by: Alex Elder <>
Signed-off-by: Herton Ronaldo Krzesinski <>
 net/ceph/messenger.c |    4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)



diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index feb5a2a..c3b628c 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -2336,7 +2336,6 @@  done_unlocked:

-	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",