From 16390c3343ca4fa4e6852060ce30a3a83246caa2 Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Mon, 20 Mar 2006 13:44:49 -0500 Subject: [PATCH] --- yaml --- r: 23945 b: refs/heads/master c: 1dd761e9070aa2e543df3db41bd75ed4b8f2fab9 h: refs/heads/master i: 23943: e3b7b089b43681e16a2a9209db60d113094c4aca v: v3 --- [refs] | 2 +- trunk/fs/nfs/callback.c | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index d9df9ac947b5..fc60f0124bdc 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5428154827c2bf7cfdc9dab60db1e0eaa57c027a +refs/heads/master: 1dd761e9070aa2e543df3db41bd75ed4b8f2fab9 diff --git a/trunk/fs/nfs/callback.c b/trunk/fs/nfs/callback.c index 2c042f8d70b5..99d2cfbce863 100644 --- a/trunk/fs/nfs/callback.c +++ b/trunk/fs/nfs/callback.c @@ -55,7 +55,12 @@ static void nfs_callback_svc(struct svc_rqst *rqstp) complete(&nfs_callback_info.started); - while (nfs_callback_info.users != 0 || !signalled()) { + for(;;) { + if (signalled()) { + if (nfs_callback_info.users == 0) + break; + flush_signals(current); + } /* * Listen for a request on the socket */ @@ -135,11 +140,13 @@ int nfs_callback_down(void) lock_kernel(); down(&nfs_callback_sema); - if (--nfs_callback_info.users || nfs_callback_info.pid == 0) - goto out; - kill_proc(nfs_callback_info.pid, SIGKILL, 1); - wait_for_completion(&nfs_callback_info.stopped); -out: + nfs_callback_info.users--; + do { + if (nfs_callback_info.users != 0 || nfs_callback_info.pid == 0) + break; + if (kill_proc(nfs_callback_info.pid, SIGKILL, 1) < 0) + break; + } while (wait_for_completion_timeout(&nfs_callback_info.stopped, 5*HZ) == 0); up(&nfs_callback_sema); unlock_kernel(); return ret;