|
@@ -128,22 +128,24 @@ nfs41_callback_svc(void *vrqstp)
|
|
if (try_to_freeze())
|
|
if (try_to_freeze())
|
|
continue;
|
|
continue;
|
|
|
|
|
|
- prepare_to_wait(&serv->sv_cb_waitq, &wq, TASK_INTERRUPTIBLE);
|
|
|
|
|
|
+ prepare_to_wait(&serv->sv_cb_waitq, &wq, TASK_UNINTERRUPTIBLE);
|
|
spin_lock_bh(&serv->sv_cb_lock);
|
|
spin_lock_bh(&serv->sv_cb_lock);
|
|
if (!list_empty(&serv->sv_cb_list)) {
|
|
if (!list_empty(&serv->sv_cb_list)) {
|
|
req = list_first_entry(&serv->sv_cb_list,
|
|
req = list_first_entry(&serv->sv_cb_list,
|
|
struct rpc_rqst, rq_bc_list);
|
|
struct rpc_rqst, rq_bc_list);
|
|
list_del(&req->rq_bc_list);
|
|
list_del(&req->rq_bc_list);
|
|
spin_unlock_bh(&serv->sv_cb_lock);
|
|
spin_unlock_bh(&serv->sv_cb_lock);
|
|
|
|
+ finish_wait(&serv->sv_cb_waitq, &wq);
|
|
dprintk("Invoking bc_svc_process()\n");
|
|
dprintk("Invoking bc_svc_process()\n");
|
|
error = bc_svc_process(serv, req, rqstp);
|
|
error = bc_svc_process(serv, req, rqstp);
|
|
dprintk("bc_svc_process() returned w/ error code= %d\n",
|
|
dprintk("bc_svc_process() returned w/ error code= %d\n",
|
|
error);
|
|
error);
|
|
} else {
|
|
} else {
|
|
spin_unlock_bh(&serv->sv_cb_lock);
|
|
spin_unlock_bh(&serv->sv_cb_lock);
|
|
- schedule();
|
|
|
|
|
|
+ /* schedule_timeout to game the hung task watchdog */
|
|
|
|
+ schedule_timeout(60 * HZ);
|
|
|
|
+ finish_wait(&serv->sv_cb_waitq, &wq);
|
|
}
|
|
}
|
|
- finish_wait(&serv->sv_cb_waitq, &wq);
|
|
|
|
}
|
|
}
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|