NFS handle
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_handle
和ceph_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自己认识的句柄。