/* * The callback service for NFSv4.1 callbacks */ static int nfs41_callback_svc(void *vrqstp) { struct svc_rqst *rqstp = vrqstp; struct svc_serv *serv = rqstp->rq_server; struct rpc_rqst *req; int error; DEFINE_WAIT(wq); set_freezable(); 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); if (!list_empty(&serv->sv_cb_list)) { req = list_first_entry(&serv->sv_cb_list, struct rpc_rqst, rq_bc_list); list_del(&req->rq_bc_list); spin_unlock_bh(&serv->sv_cb_lock); finish_wait(&serv->sv_cb_waitq, &wq); dprintk("Invoking bc_svc_process()\n"); error = bc_svc_process(serv, req, rqstp); dprintk("bc_svc_process() returned w/ error code= %d\n", error); } else {
static int flush_delta_work(void *data) { struct sb *sb = data; int err; set_freezable(); /* * Our parent may run at a different priority, just set us to normal */ set_user_nice(current, 0); while (!kthread_freezable_should_stop(NULL)) { if (test_bit(TUX3_COMMIT_PENDING_BIT, &sb->backend_state)) { clear_bit(TUX3_COMMIT_PENDING_BIT, &sb->backend_state); err = flush_delta(sb); /* FIXME: error handling */ } set_current_state(TASK_INTERRUPTIBLE); if (!test_bit(TUX3_COMMIT_PENDING_BIT, &sb->backend_state) && !kthread_should_stop()) schedule(); __set_current_state(TASK_RUNNING); } return 0; }
/* * This is the NFSv4 callback kernel thread. */ static int nfs4_callback_svc(void *vrqstp) { int err; struct svc_rqst *rqstp = vrqstp; set_freezable(); while (!kthread_freezable_should_stop(NULL)) { if (signal_pending(current)) flush_signals(current); /* * Listen for a request on the socket */ err = svc_recv(rqstp, MAX_SCHEDULE_TIMEOUT); if (err == -EAGAIN || err == -EINTR) continue; svc_process(rqstp); } svc_exit_thread(rqstp); module_put_and_exit(0); return 0; }