Patchwork [3.5.yuz,extended,stable] Patch "libceph: don't change socket state on sock event" has been added to staging queue

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


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

    libceph: don't change socket state on sock event

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 af1a7a044086385fb58e388205ac943a3b2dfe8a Mon Sep 17 00:00:00 2001
From: Alex Elder <>
Date: Wed, 20 Jun 2012 21:53:53 -0500
Subject: [PATCH 33/78] libceph: don't change socket state on sock event

commit 188048bce311ee41e5178bc3255415d0eae28423 upstream.

Currently the socket state change event handler records an error
message on a connection to distinguish a close while connecting from
a close while a connection was already established.

Changing connection information during handling of a socket event is
not very clean, so instead move this assignment inside con_work(),
where it can be done during normal connection-level processing (and
under protection of the connection mutex as well).

Move the handling of a socket closed event up to the top of the
processing loop in con_work(); there's no point in handling backoff
etc. if we have a newly-closed socket to take care of.

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



diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index d0aca62..5bd243e 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -261,13 +261,8 @@  static void ceph_sock_state_change(struct sock *sk)
 		dout("%s TCP_CLOSE_WAIT\n", __func__);
-		if (test_and_set_bit(SOCK_CLOSED, &con->flags) == 0) {
-			if (test_bit(CONNECTING, &con->state))
-				con->error_msg = "connection failed";
-			else
-				con->error_msg = "socket closed";
+		if (!test_and_set_bit(SOCK_CLOSED, &con->flags))
-		}
 		dout("%s TCP_ESTABLISHED\n", __func__);
@@ -2187,6 +2182,14 @@  static void con_work(struct work_struct *work)

+	if (test_and_clear_bit(SOCK_CLOSED, &con->flags)) {
+		if (test_bit(CONNECTING, &con->state))
+			con->error_msg = "connection failed";
+		else
+			con->error_msg = "socket closed";
+		goto fault;
+	}
 	if (test_and_clear_bit(BACKOFF, &con->flags)) {
 		dout("con_work %p backing off\n", con);
 		if (queue_delayed_work(ceph_msgr_wq, &con->work,
@@ -2216,9 +2219,6 @@  restart:

-	if (test_and_clear_bit(SOCK_CLOSED, &con->flags))
-		goto fault;
 	ret = try_read(con);
 	if (ret == -EAGAIN)
 		goto restart;