NFS handle

2019-07-26  本文已影响0人  帆子_8c3a

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自己认识的句柄。

上一篇下一篇

猜你喜欢

热点阅读