All of lore.kernel.org
 help / color / mirror / Atom feed
From: Olaf Kirch <okir@suse.de>
To: "Richard J.Farnsworth" <rjf@maui.cs.washington.edu>
Cc: nfs@lists.sourceforge.net
Subject: [PATCH]: Fix EJUKEBOX handling
Date: Mon, 11 Jul 2005 11:34:44 +0200	[thread overview]
Message-ID: <20050711093444.GA29922@suse.de> (raw)
In-Reply-To: <1109028596/rjf@maui.cs.washington.edu>

[-- Attachment #1: Type: text/plain, Size: 2339 bytes --]

Hi all,

this problem still seems to be present in 2.6.12, or am I
missing something?

The patch I've been using is attached below.

Olaf

On Thu, Feb 24, 2005 at 05:08:35AM +0000, Richard J.Farnsworth wrote:
> There seems to be a bug in the 2.6.11-rc code related to the handling
> of nfsd's EJUNKBOX error return.  The code for __rpc_execute in
> net/sunrpc/sched.c looks like:
> 
> =============================
> 
> static int __rpc_execute(struct rpc_task *task)
> {
> 	int		status = 0;
> 
> 	dprintk("RPC: %4d rpc_execute flgs %x\n",
> 				task->tk_pid, task->tk_flags);
> 
> 	BUG_ON(RPC_IS_QUEUED(task));
> 
>  restarted:
> 	while (1) {
> 		/*
> 		 * Garbage collection of pending timers...
> 		 */
> 		rpc_delete_timer(task);
> 
>  .....
> 
> 	if (task->tk_exit) {
> 		lock_kernel();
> >>>>		task->tk_exit(task);
> 		unlock_kernel();
> 		/* If tk_action is non-null, the user wants us to restart */
> 		if (task->tk_action) {
> 			if (!RPC_ASSASSINATED(task)) {
> 				/* Release RPC slot and buffer memory */
> 				if (task->tk_rqstp)
> 					xprt_release(task);
> 				rpc_free(task);
> 				goto restarted;
> 			}
> 			printk(KERN_ERR "RPC: dead task tries to walk away.\n");
> 		}
> 	}
> 
> =============================
> 
> If the tk_exit procedure (e.g., nfs_read_done) called at ">>>>" above
> detects EJUKEBOX as the result of the call, it will attempt to do
> an rpc_restart and rpc_delay on the task.  The rpc_delay will set a timer.
> However, when the main loop is re-entered via the "goto restarted",
> the first thing that happens is that all timers for the task are removed.
> This results in the RPC task hanging in an uninterruptible wait.
> 
> Am I missing something here or is this really a problem?
> 
> 
> 
> 
> 
> -------------------------------------------------------
> SF email is sponsored by - The IT Product Guide
> Read honest & candid reviews on hundreds of IT Products from real users.
> Discover which products truly live up to the hype. Start reading now.
> http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
> _______________________________________________
> NFS maillist  -  NFS@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/nfs

-- 
Olaf Kirch   |  --- o --- Nous sommes du soleil we love when we play
okir@suse.de |    / | \   sol.dhoop.naytheet.ah kin.ir.samse.qurax

[-- Attachment #2: sunrpc-restart-delay-fix --]
[-- Type: text/plain, Size: 880 bytes --]

From: Olaf Kirch <okir@suse.de>
Subject: NFS: prevent hangs when NFS server returns EJUKEBOX

When an NFS server returns EJUKEBOX, we restart the RPC task, setting
a delay of a few seconds so that the call is retried a little later.
Unfortunately, we will kill the timer immediately afterwards when we
re-enter the main loop in __rpc_execute.

The fix below will kill the timer only when the task is actually
running.

Signed-off-by: okir@suse.de

Index: linux-2.6.10/net/sunrpc/sched.c
===================================================================
--- linux-2.6.10.orig/net/sunrpc/sched.c
+++ linux-2.6.10/net/sunrpc/sched.c
@@ -569,7 +569,8 @@ static int __rpc_execute(struct rpc_task
 		/*
 		 * Garbage collection of pending timers...
 		 */
-		rpc_delete_timer(task);
+		if (RPC_IS_RUNNING(task))
+			rpc_delete_timer(task);
 
 		/*
 		 * Execute any pending callback.

  reply	other threads:[~2005-07-11  9:34 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-02-24  6:05 Bug in NFS client handling of EJUKEBOX? Richard J.Farnsworth
2005-07-11  9:34 ` Olaf Kirch [this message]
2005-07-11 12:09   ` [PATCH]: Fix EJUKEBOX handling Trond Myklebust

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20050711093444.GA29922@suse.de \
    --to=okir@suse.de \
    --cc=nfs@lists.sourceforge.net \
    --cc=rjf@maui.cs.washington.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.