[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