NFS Client in Linux Kernel - RPC调用

  • 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调用)