[kernel] r13029 - in dists/lenny/linux-2.6/debian: . patches/bugfix/all patches/series

Ian Campbell ijc-guest at alioth.debian.org
Sun Mar 8 16:02:07 UTC 2009


Author: ijc-guest
Date: Sun Mar  8 16:02:05 2009
New Revision: 13029

Log:
[nfs] Add upstream patches for NFS lockup "task blocked for more than 120
seconds" (Closes: #518431)

Added:
   dists/lenny/linux-2.6/debian/patches/bugfix/all/SUNRPC-Ensure-the-server-closes-sockets-in-a-timely.patch
   dists/lenny/linux-2.6/debian/patches/bugfix/all/svc-Clean-up-deferred-requests-on-transport-destruc.patch
Modified:
   dists/lenny/linux-2.6/debian/changelog
   dists/lenny/linux-2.6/debian/patches/series/14

Modified: dists/lenny/linux-2.6/debian/changelog
==============================================================================
--- dists/lenny/linux-2.6/debian/changelog	(original)
+++ dists/lenny/linux-2.6/debian/changelog	Sun Mar  8 16:02:05 2009
@@ -32,6 +32,10 @@
   * [sparc] Revert: Reintroduce dummy PCI host controller to workaround broken
     X.org. Not supportable and breaks to many things.
 
+  [ Ian Campbell ]
+  * [nfs] Backport upstream patches to fix NFS "task blocked for more than 120
+    seconds" issue (Closes: #518431)
+
  -- dann frazier <dannf at debian.org>  Fri, 13 Feb 2009 10:46:22 -0700
 
 linux-2.6 (2.6.26-13) unstable; urgency=high

Added: dists/lenny/linux-2.6/debian/patches/bugfix/all/SUNRPC-Ensure-the-server-closes-sockets-in-a-timely.patch
==============================================================================
--- (empty file)
+++ dists/lenny/linux-2.6/debian/patches/bugfix/all/SUNRPC-Ensure-the-server-closes-sockets-in-a-timely.patch	Sun Mar  8 16:02:05 2009
@@ -0,0 +1,64 @@
+From 69b6ba3712b796a66595cfaf0a5ab4dfe1cf964a Mon Sep 17 00:00:00 2001
+From: Trond Myklebust <Trond.Myklebust at netapp.com>
+Date: Tue, 23 Dec 2008 16:30:11 -0500
+Subject: [PATCH] SUNRPC: Ensure the server closes sockets in a timely fashion
+
+We want to ensure that connected sockets close down the connection when we
+set XPT_CLOSE, so that we don't keep it hanging while cleaning up all the
+stuff that is keeping a reference to the socket.
+
+Signed-off-by: Trond Myklebust <Trond.Myklebust at netapp.com>
+Signed-off-by: J. Bruce Fields <bfields at citi.umich.edu>
+---
+ net/sunrpc/svcsock.c |   21 ++++++++++++++++++++-
+ 1 files changed, 20 insertions(+), 1 deletions(-)
+
+diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
+index ef3238d..cccfa7d 100644
+--- a/net/sunrpc/svcsock.c
++++ b/net/sunrpc/svcsock.c
+@@ -59,6 +59,7 @@ static void		svc_udp_data_ready(struct sock *, int);
+ static int		svc_udp_recvfrom(struct svc_rqst *);
+ static int		svc_udp_sendto(struct svc_rqst *);
+ static void		svc_sock_detach(struct svc_xprt *);
++static void		svc_tcp_sock_detach(struct svc_xprt *);
+ static void		svc_sock_free(struct svc_xprt *);
+ 
+ static struct svc_xprt *svc_create_socket(struct svc_serv *, int,
+@@ -1017,7 +1018,7 @@ static struct svc_xprt_ops svc_tcp_ops = {
+ 	.xpo_recvfrom = svc_tcp_recvfrom,
+ 	.xpo_sendto = svc_tcp_sendto,
+ 	.xpo_release_rqst = svc_release_skb,
+-	.xpo_detach = svc_sock_detach,
++	.xpo_detach = svc_tcp_sock_detach,
+ 	.xpo_free = svc_sock_free,
+ 	.xpo_prep_reply_hdr = svc_tcp_prep_reply_hdr,
+ 	.xpo_has_wspace = svc_tcp_has_wspace,
+@@ -1287,6 +1288,24 @@ static void svc_sock_detach(struct svc_xprt *xprt)
+ 	sk->sk_state_change = svsk->sk_ostate;
+ 	sk->sk_data_ready = svsk->sk_odata;
+ 	sk->sk_write_space = svsk->sk_owspace;
++
++	if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
++		wake_up_interruptible(sk->sk_sleep);
++}
++
++/*
++ * Disconnect the socket, and reset the callbacks
++ */
++static void svc_tcp_sock_detach(struct svc_xprt *xprt)
++{
++	struct svc_sock *svsk = container_of(xprt, struct svc_sock, sk_xprt);
++
++	dprintk("svc: svc_tcp_sock_detach(%p)\n", svsk);
++
++	svc_sock_detach(xprt);
++
++	if (!test_bit(XPT_LISTENER, &xprt->xpt_flags))
++		kernel_sock_shutdown(svsk->sk_sock, SHUT_RDWR);
+ }
+ 
+ /*
+-- 
+1.5.6.5
+

Added: dists/lenny/linux-2.6/debian/patches/bugfix/all/svc-Clean-up-deferred-requests-on-transport-destruc.patch
==============================================================================
--- (empty file)
+++ dists/lenny/linux-2.6/debian/patches/bugfix/all/svc-Clean-up-deferred-requests-on-transport-destruc.patch	Sun Mar  8 16:02:05 2009
@@ -0,0 +1,83 @@
+From 22945e4a1c7454c97f5d8aee1ef526c83fef3223 Mon Sep 17 00:00:00 2001
+From: Tom Tucker <tom at opengridcomputing.com>
+Date: Mon, 5 Jan 2009 15:21:19 -0600
+Subject: [PATCH] svc: Clean up deferred requests on transport destruction
+
+A race between svc_revisit and svc_delete_xprt can result in
+deferred requests holding references on a transport that can never be
+recovered because dead transports are not enqueued for subsequent
+processing.
+
+Check for XPT_DEAD in revisit to clean up completing deferrals on a dead
+transport and sweep a transport's deferred queue to do the same for queued
+but unprocessed deferrals.
+
+Signed-off-by: Tom Tucker <tom at opengridcomputing.com>
+Signed-off-by: J. Bruce Fields <bfields at citi.umich.edu>
+---
+ net/sunrpc/svc_xprt.c |   25 ++++++++++++++++++-------
+ 1 files changed, 18 insertions(+), 7 deletions(-)
+
+diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
+index 2961961..a78b879 100644
+--- a/net/sunrpc/svc_xprt.c
++++ b/net/sunrpc/svc_xprt.c
+@@ -850,6 +850,11 @@ static void svc_age_temp_xprts(unsigned long closure)
+ void svc_delete_xprt(struct svc_xprt *xprt)
+ {
+ 	struct svc_serv	*serv = xprt->xpt_server;
++	struct svc_deferred_req *dr;
++
++	/* Only do this once */
++	if (test_and_set_bit(XPT_DEAD, &xprt->xpt_flags))
++		return;
+ 
+ 	dprintk("svc: svc_delete_xprt(%p)\n", xprt);
+ 	xprt->xpt_ops->xpo_detach(xprt);
+@@ -864,12 +869,16 @@ void svc_delete_xprt(struct svc_xprt *xprt)
+ 	 * while still attached to a queue, the queue itself
+ 	 * is about to be destroyed (in svc_destroy).
+ 	 */
+-	if (!test_and_set_bit(XPT_DEAD, &xprt->xpt_flags)) {
+-		BUG_ON(atomic_read(&xprt->xpt_ref.refcount) < 2);
+-		if (test_bit(XPT_TEMP, &xprt->xpt_flags))
+-			serv->sv_tmpcnt--;
++	if (test_bit(XPT_TEMP, &xprt->xpt_flags))
++		serv->sv_tmpcnt--;
++
++	for (dr = svc_deferred_dequeue(xprt); dr;
++	     dr = svc_deferred_dequeue(xprt)) {
+ 		svc_xprt_put(xprt);
++		kfree(dr);
+ 	}
++
++	svc_xprt_put(xprt);
+ 	spin_unlock_bh(&serv->sv_lock);
+ }
+ 
+@@ -915,17 +924,19 @@ static void svc_revisit(struct cache_deferred_req *dreq, int too_many)
+ 		container_of(dreq, struct svc_deferred_req, handle);
+ 	struct svc_xprt *xprt = dr->xprt;
+ 
+-	if (too_many) {
++	spin_lock(&xprt->xpt_lock);
++	set_bit(XPT_DEFERRED, &xprt->xpt_flags);
++	if (too_many || test_bit(XPT_DEAD, &xprt->xpt_flags)) {
++		spin_unlock(&xprt->xpt_lock);
++		dprintk("revisit canceled\n");
+ 		svc_xprt_put(xprt);
+ 		kfree(dr);
+ 		return;
+ 	}
+ 	dprintk("revisit queued\n");
+ 	dr->xprt = NULL;
+-	spin_lock(&xprt->xpt_lock);
+ 	list_add(&dr->handle.recent, &xprt->xpt_deferred);
+ 	spin_unlock(&xprt->xpt_lock);
+-	set_bit(XPT_DEFERRED, &xprt->xpt_flags);
+ 	svc_xprt_enqueue(xprt);
+ 	svc_xprt_put(xprt);
+ }
+-- 
+1.5.6.5
+

Modified: dists/lenny/linux-2.6/debian/patches/series/14
==============================================================================
--- dists/lenny/linux-2.6/debian/patches/series/14	(original)
+++ dists/lenny/linux-2.6/debian/patches/series/14	Sun Mar  8 16:02:05 2009
@@ -16,3 +16,5 @@
 + bugfix/sparc/sungem-soft-lockup-fix.patch
 + bugfix/x86/agp-intel-add-support-for-G41-chipset.patch
 + bugfix/mips/ip32-register-cmos.patch
++ bugfix/all/SUNRPC-Ensure-the-server-closes-sockets-in-a-timely.patch
++ bugfix/all/svc-Clean-up-deferred-requests-on-transport-destruc.patch



More information about the Kernel-svn-changes mailing list