cephfs linux kernel client针对export的操作

走远了吗. 提交于 2019-12-09 10:11:01

const struct export_operations ceph_export_ops = {

        .encode_fh = ceph_encode_fh,

        .fh_to_dentry = ceph_fh_to_dentry,

        .fh_to_parent = ceph_fh_to_parent,

        .get_parent = ceph_get_parent,

        .get_name = ceph_get_name,

};

 

ceph_encode_fh(struct inode *inode, u32 *rawfh, int *max_len, struct inode *parent_inode)

|__调用ceph_snap(inode)函数检查inode是否包含snap信息,若包含snap则直接返回

|__输入参数校验

    |__若parent_inode不为空且max_len小于sizeof(struct ceph_nfs_confh)/4

        |__设置max_len=sizeof(struct ceph_nfs_confh)/4

        |__直接返回

    |__若parent_inode为空且max_len小于sizeof(struct ceph_nfs_fh)/4

        |__设置max_len=sizeof(struct ceph_nfs_fh)/4

        |__直接返回

|__若parent_inode不为空

    |__设置struct ceph_nfs_confh的ino为inode的ino

    |__设置struct ceph_nfs_confh的parent_ino为parent_inode的ino

    |__设置max_len为sizeof(struct ceph_nfs_confh)/4

    |__返回FILEID_INO32_GEN_PARENT

|__若parent_inode为空

    |__设置struct ceph_nfs_fh的ino为inode的ino

    |__设置max_len为sizeof(struct ceph_nfs_fh)/4

    |__返回FILEID_INO32_GEN

 

ceph_fs_to_dentry(struct super_block *sb, struct fid *fid, int fh_len, int fh_type)

|__通过fid得到struct ceph_nfs_fh对象

|__检查fh_type是否是FILEID_INO32_GEN或FILEID_INO32_GEN_PARENT,若不是则直接返回

|__调用__fh_to_dentry(sb, fh->ino)函数找到fh->ino对应的dentry结构

 

__fh_to_dentry(struct super_block *sb, u64 ino)

|__通过sb得到struct ceph_mds_client结构

|__调用ceph_find_inode()函数得到ino指定的struct inode结构

|__若struct inode结构为空

    |__调用ceph_mdsc_create_request(CEPH_MDS_OP_LOOKUPINO)函数创建查找指定inode的请求

    |__调用ceph_mdsc_do_reqeust()函数将请求发送给mds集群得到指定inode number对应的inode结构

|__调用d_obtain_alias(inode)函数得到inode对应的dentry信息

|__调用ceph_init_dentry()函数来初始化dentry数据结构

 

ceph_fh_to_parent(struct super_block *sb, struct fid *fid, int fh_len, int fh_type)

|__通过sb得到struct ceph_mds_client结构

|__调用__get_parent()函数获取cfh->ino对应的parent的dentry结构

|__若获取parent的dentry结构失败

    |__调用__fh_to_dentry(sb, cfh->parent_ino)函数获取parent_ino对应的dentry结构

 

__get_parent(struct super_block *sb, struct dentry *child, u64 ino)

|__通过sb得到struct ceph_mds_client结构

|__调用ceph_mdsc_create_request(CEPH_MDS_OP_LOOKUPPARENT)函数创建查找parent inode的请求

|__调用ceph_mdsc_do_request()函数将请求发送给mds集群

|__从请求的r_target_inode字段得到parent inode信息

|__调用d_obtain_alias(inode)函数得到inode对应的dentry

|__调用ceph_init_dentry(dentry)函数初始化dentry数据结构

 

ceph_get_parent(struct dentry *child)

|__调用ceph_snap()函数检查child是否包含snap,若包含snap则直接返回

|__调用__get_parent()函数获取child对应parent的dentry结构

 

ceph_get_name(struct dentry *parent, char *name, struct dentry *child)

|__从child得到struct ceph_mds_client数据结构

|__调用ceph_mdsc_create_request(CEPH_MDS_OP_LOOKUPNAME)函数创建查找inode name的请求

|__调用ceph_mdsc_do_request()函数将请求同步发送给mds集群

|__调用memcpy()函数将请求的返回信息中的dname复制到name中

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!