Patchwork [3.5.yuz,extended,stable] Patch "libceph: just set SOCK_CLOSED when state changes" 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/200441/
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: just set SOCK_CLOSED when state changes

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 e8d4410b595bb3c160244219711722dd95be9175 Mon Sep 17 00:00:00 2001
From: Alex Elder <>
Date: Wed, 20 Jun 2012 21:53:53 -0500
Subject: [PATCH 34/78] libceph: just set SOCK_CLOSED when state changes

commit d65c9e0b9eb43d14ece9dd843506ccba06162ee7 upstream.

When a TCP_CLOSE or TCP_CLOSE_WAIT event occurs, the SOCK_CLOSED
connection flag bit is set, and if it had not been previously set
queue_con() is called to ensure con_work() will get a chance to
handle the changed state.

con_work() atomically checks--and if set, clears--the SOCK_CLOSED
bit if it was set.  This means that even if the bit were set
repeatedly, the related processing in con_work() only gets called
once per transition of the bit from 0 to 1.

What's important then is that we ensure con_work() gets called *at
least* once when a socket close event occurs, not that it gets
called *exactly* once.

The work queue mechanism already takes care of queueing work
only if it is not already queued, so there's no need for us
to call queue_con() conditionally.

So this patch just makes it so the SOCK_CLOSED flag gets set
unconditionally in ceph_sock_state_change().

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



diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index 5bd243e..cd1aaa8 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -261,8 +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))
-			queue_con(con);
+		set_bit(SOCK_CLOSED, &con->flags);
+		queue_con(con);
 		dout("%s TCP_ESTABLISHED\n", __func__);