美文网首页
NFS Client in Linux Kernel - RPC

NFS Client in Linux Kernel - RPC

作者: 帆子_8c3a | 来源:发表于2019-03-14 12:57 被阅读0次
    • Client代码位于fs/nfs, 由NetApp的Trond Myklebust维护。
    • Server分代码位于fs/nfsd,由RedHat的J. Bruce Fields维护。
    • RPC代码位于net/sunrpc/

    1. RPC 请求

    摘抄自nfs-ganesha中的nfsv41.x

    program NFS4_PROGRAM {
            version NFS_V4 {
                    void
                            NFSPROC4_NULL(void) = 0;
    
                    COMPOUND4res
                            NFSPROC4_COMPOUND(COMPOUND4args) = 1;
    
            } = 4;
    } = 100003;
    
    program NFS4_CALLBACK {
            version NFS_CB {
                    void
                            CB_NULL(void) = 0;
                    CB_COMPOUND4res
                            CB_COMPOUND(CB_COMPOUND4args) = 1;
            } = 1;
    } = 0x40000000;
    

    2. Operations in RPC

    enum {
        NFSPROC4_CLNT_NULL = 0,     /* Unused */
        NFSPROC4_CLNT_READ,
        NFSPROC4_CLNT_WRITE,
        NFSPROC4_CLNT_COMMIT,
        NFSPROC4_CLNT_OPEN,
        NFSPROC4_CLNT_OPEN_CONFIRM,
        NFSPROC4_CLNT_OPEN_NOATTR,
        NFSPROC4_CLNT_OPEN_DOWNGRADE,
        NFSPROC4_CLNT_CLOSE,
        NFSPROC4_CLNT_SETATTR,
            ......
        /* nfs41 */
        NFSPROC4_CLNT_EXCHANGE_ID,
        NFSPROC4_CLNT_CREATE_SESSION,
        NFSPROC4_CLNT_DESTROY_SESSION,
        NFSPROC4_CLNT_SEQUENCE,
        NFSPROC4_CLNT_GET_LEASE_TIME,
        NFSPROC4_CLNT_RECLAIM_COMPLETE,
        NFSPROC4_CLNT_LAYOUTGET,
        NFSPROC4_CLNT_GETDEVICEINFO,
        NFSPROC4_CLNT_LAYOUTCOMMIT,
        NFSPROC4_CLNT_LAYOUTRETURN,
        NFSPROC4_CLNT_SECINFO_NO_NAME,
        NFSPROC4_CLNT_TEST_STATEID,
        NFSPROC4_CLNT_FREE_STATEID,
        NFSPROC4_CLNT_GETDEVICELIST,
        NFSPROC4_CLNT_BIND_CONN_TO_SESSION,
        NFSPROC4_CLNT_DESTROY_CLIENTID,
    };
    

    3. NFS Operation的encode和decode处理函数

    nfs4_procedures描述了PRC的encode和decode函数。

    struct rpc_procinfo nfs4_procedures[] = {
        PROC(READ,      enc_read,       dec_read),
        PROC(WRITE,     enc_write,      dec_write),
        PROC(COMMIT,        enc_commit,     dec_commit),
    ...
    }
    

    例如READ的编解码函数是:
    enc_read => nfs4_xdr_enc_read()
    dec_read => nfs4_xdr_dec_read()

    4. RPC callback处理函数

    /*
     * Define NFS4 callback procedures
     */
    static struct svc_procedure nfs4_callback_procedures1[] = {
        [CB_NULL] = {
            .pc_func = nfs4_callback_null,
            .pc_decode = (kxdrproc_t)nfs4_decode_void,
            .pc_encode = (kxdrproc_t)nfs4_encode_void,
            .pc_xdrressize = 1,
        },
        [CB_COMPOUND] = {
            .pc_func = nfs4_callback_compound,
            .pc_encode = (kxdrproc_t)nfs4_encode_void,
            .pc_argsize = 256,
            .pc_ressize = 256,
            .pc_xdrressize = NFS4_CALLBACK_BUFSIZE,
        }
    };
    
    struct svc_version nfs4_callback_version1 = {
        .vs_vers = 1,
        .vs_nproc = ARRAY_SIZE(nfs4_callback_procedures1),
        .vs_proc = nfs4_callback_procedures1,
        .vs_xdrsize = NFS4_CALLBACK_XDRSIZE,
        .vs_dispatch = NULL,
        .vs_hidden = 1,
    };
    

    相关文章

      网友评论

          本文标题:NFS Client in Linux Kernel - RPC

          本文链接:https://www.haomeiwen.com/subject/wxyqmqtx.html