X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fnfs%2Fcallback.c;h=fcd97406a778899a8fbec50ed6aa641d39b34ab8;hb=987b0145d94eecf292d8b301228356f44611ab7c;hp=90c95adc8c1bc06885d25837fcb466cbfc998421;hpb=f7ed79d23a47594e7834d66a8f14449796d4f3e6;p=linux-2.6.git diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c index 90c95adc8..fcd97406a 100644 --- a/fs/nfs/callback.c +++ b/fs/nfs/callback.c @@ -14,7 +14,6 @@ #include #include #include -#include #include @@ -32,7 +31,7 @@ struct nfs_callback_data { }; static struct nfs_callback_data nfs_callback_info; -static DEFINE_MUTEX(nfs_callback_mutex); +static DECLARE_MUTEX(nfs_callback_sema); static struct svc_program nfs4_callback_program; unsigned int nfs_callback_set_tcpport; @@ -56,12 +55,7 @@ static void nfs_callback_svc(struct svc_rqst *rqstp) complete(&nfs_callback_info.started); - for(;;) { - if (signalled()) { - if (nfs_callback_info.users == 0) - break; - flush_signals(current); - } + while (nfs_callback_info.users != 0 || !signalled()) { /* * Listen for a request on the socket */ @@ -79,7 +73,6 @@ static void nfs_callback_svc(struct svc_rqst *rqstp) svc_process(serv, rqstp); } - svc_exit_thread(rqstp); nfs_callback_info.pid = 0; complete(&nfs_callback_info.stopped); unlock_kernel(); @@ -96,7 +89,7 @@ int nfs_callback_up(void) int ret = 0; lock_kernel(); - mutex_lock(&nfs_callback_mutex); + down(&nfs_callback_sema); if (nfs_callback_info.users++ || nfs_callback_info.pid != 0) goto out; init_completion(&nfs_callback_info.started); @@ -122,7 +115,7 @@ int nfs_callback_up(void) nfs_callback_info.serv = serv; wait_for_completion(&nfs_callback_info.started); out: - mutex_unlock(&nfs_callback_mutex); + up(&nfs_callback_sema); unlock_kernel(); return ret; out_destroy: @@ -140,15 +133,13 @@ int nfs_callback_down(void) int ret = 0; lock_kernel(); - mutex_lock(&nfs_callback_mutex); - 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); - mutex_unlock(&nfs_callback_mutex); + 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: + up(&nfs_callback_sema); unlock_kernel(); return ret; }