美文网首页
NFS handle

NFS handle

作者: 帆子_8c3a | 来源:发表于2019-07-26 16:33 被阅读0次

    handle的意义

    server给每个文件或者目录分配一个handle,client会根据这个handle来定位要操作那个文件。

    相关的operations

    NFS4以后一个compound RPC里会有多个operation,一般会设置一个current handle。以后的操作是针对这个文件操作。例如:

    //实现了查询某目录下的 /pub/foo/bar,并把中间的所有handle记录在RPC的结果里
    PUTFH or PUTROOTFH (directory filehandle)
    LOOKUP "pub" //根据current handle,查询子目录"pub",结果存在current handle里
    GETFH //把结果放到RPC返回结果里
    LOOKUP "foo"
    GETFH
    LOOKUP "bar"
    GETFH
    

    PUTROOTFH

    设置current handle,但参数里没有指定handle,由server负责构造root,并替换current handle。

    PUTFH

    设置current handle,参数里提供指定handle

    GETFH

    将current handle存入RPC的返回结果里,client可以获得此值。

    LOOKUP

    将查询结果存入current handle,如果后面有GETFH,client就可以得到这个结果。

    SAVEFH

    在rename时候用

    static void nfs4_xdr_enc_rename(struct rpc_rqst *req, struct xdr_stream *xdr,
                    const struct nfs_renameargs *args)
    {
        struct compound_hdr hdr = {
            .minorversion = nfs4_xdr_minorversion(&args->seq_args),
        };
    
        encode_compound_hdr(xdr, req, &hdr);
        encode_sequence(xdr, &args->seq_args, &hdr);
        encode_putfh(xdr, args->old_dir, &hdr);
        encode_savefh(xdr, &hdr);
        encode_putfh(xdr, args->new_dir, &hdr);
        encode_rename(xdr, args->old_name, args->new_name, &hdr);
        encode_nops(&hdr);
    }
    

    handle的生成

    参见nfs-ganesha中Ceph FSAL中的construct_handleceph_fsal_handle_to_wire

    ganesha中相关数据结构和函数

    nfs_fh4

    client用它(可以理解为一串数字),来索引一个文件或目录对象。对于ganesha来说,它具有特定含义。FSAL层负责去填充fsopaque域,如ceph_fsal_handle_to_wire

    typedef struct __attribute__ ((__packed__)) file_handle_v4 {
        uint8_t fhversion;  /*< Set to 0x41 to separate from Linux knfsd */
        uint8_t fhflags1;   /*< To replace things like ds_flag */
        union {
            uint16_t exports;   /*< FSAL exports, export_by_id */
            uint16_t servers;   /*< FSAL servers, server_by_id */
        } id;
        uint8_t fs_len;     /*< Length of opaque handle */
        uint8_t fsopaque[]; /*< FSAL handle */
    } file_handle_v4_t;
    

    fsal_obj_handle

    server用它表示一个文件或目录对象。

    nfs4_FSALToFhandle

    负责fsal_obj_handle => nfs_fh4,会调用内部的handle_to_wire,如ceph_fsal_handle_to_wire来构造nfs_fh4的内容中的fsopaque部分。这里的wire原意是电线,这里是指把内存中的东西,序列化成NFS协议里的handle

    PUTFH

    NFS Sever接收到client发来的handle, nfs-ganesha接收到它后,用file_handle_v4_t解析。通过wire_to_host函数,对其中的fsopaque部分解析。对于ceph来说,可以得到inode等信息。然后通过create_handle函数,通过得到的inode信息等,进一步得到ceph自己认识的句柄。

    相关文章

      网友评论

          本文标题:NFS handle

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