PNFS 中CALL BACK机制的客户端代码

nfs4_init_client_minor_version

nfs4_init_callback(clp)

nfs_callback_up(clp->cl_minorversion,  clp->cl_rpcclient->cl_xprt)中有如下代码

cb_info->task = kthread_run(callback_svc, cb_info->rqst, svc_name);

callback_svc 指向nfs41_callback_svc

其代码如下

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();

    /*
     * FIXME: do we really need to run this under the BKL? If so, please
     * add a comment about what it's intended to protect.
     */
    lock_kernel();
    while (!kthread_should_stop()) {
        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);
            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 {
            spin_unlock_bh(&serv->sv_cb_lock);
            schedule();
        }
        finish_wait(&serv->sv_cb_waitq, &wq);
    }
    unlock_kernel();
    return 0;




你可能感兴趣的:(PNFS 中CALL BACK机制的客户端代码)