|
@@ -76,7 +76,10 @@ nfs4_callback_svc(void *vrqstp)
|
|
|
|
|
|
set_freezable();
|
|
|
|
|
|
- while (!kthread_should_stop()) {
|
|
|
+ while (!kthread_freezable_should_stop(NULL)) {
|
|
|
+
|
|
|
+ if (signal_pending(current))
|
|
|
+ flush_signals(current);
|
|
|
/*
|
|
|
* Listen for a request on the socket
|
|
|
*/
|
|
@@ -85,6 +88,8 @@ nfs4_callback_svc(void *vrqstp)
|
|
|
continue;
|
|
|
svc_process(rqstp);
|
|
|
}
|
|
|
+ svc_exit_thread(rqstp);
|
|
|
+ module_put_and_exit(0);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -103,9 +108,10 @@ nfs41_callback_svc(void *vrqstp)
|
|
|
|
|
|
set_freezable();
|
|
|
|
|
|
- while (!kthread_should_stop()) {
|
|
|
- if (try_to_freeze())
|
|
|
- continue;
|
|
|
+ while (!kthread_freezable_should_stop(NULL)) {
|
|
|
+
|
|
|
+ if (signal_pending(current))
|
|
|
+ flush_signals(current);
|
|
|
|
|
|
prepare_to_wait(&serv->sv_cb_waitq, &wq, TASK_INTERRUPTIBLE);
|
|
|
spin_lock_bh(&serv->sv_cb_lock);
|
|
@@ -121,11 +127,13 @@ nfs41_callback_svc(void *vrqstp)
|
|
|
error);
|
|
|
} else {
|
|
|
spin_unlock_bh(&serv->sv_cb_lock);
|
|
|
- schedule();
|
|
|
+ if (!kthread_should_stop())
|
|
|
+ schedule();
|
|
|
finish_wait(&serv->sv_cb_waitq, &wq);
|
|
|
}
|
|
|
- flush_signals(current);
|
|
|
}
|
|
|
+ svc_exit_thread(rqstp);
|
|
|
+ module_put_and_exit(0);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -221,14 +229,14 @@ err_bind:
|
|
|
static struct svc_serv_ops nfs40_cb_sv_ops = {
|
|
|
.svo_function = nfs4_callback_svc,
|
|
|
.svo_enqueue_xprt = svc_xprt_do_enqueue,
|
|
|
- .svo_setup = svc_set_num_threads,
|
|
|
+ .svo_setup = svc_set_num_threads_sync,
|
|
|
.svo_module = THIS_MODULE,
|
|
|
};
|
|
|
#if defined(CONFIG_NFS_V4_1)
|
|
|
static struct svc_serv_ops nfs41_cb_sv_ops = {
|
|
|
.svo_function = nfs41_callback_svc,
|
|
|
.svo_enqueue_xprt = svc_xprt_do_enqueue,
|
|
|
- .svo_setup = svc_set_num_threads,
|
|
|
+ .svo_setup = svc_set_num_threads_sync,
|
|
|
.svo_module = THIS_MODULE,
|
|
|
};
|
|
|
|