mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 11:46:19 +00:00
NFSv4: Ensure the callback daemon flushes signals
If the callback daemon is signalled, but is unable to exit because it still has users, then we need to flush signals. If not, then svc_recv() can never sleep, and so we hang. If we flush signals, then we also have to be prepared to resend them when we want the thread to exit. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
5428154827
commit
1dd761e907
1 changed files with 13 additions and 6 deletions
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue