文档章节

cephfs linux kernel client针对export的操作

linuxhunter
 linuxhunter
发布于 2016/08/16 16:46
字数 647
阅读 131
收藏 0

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中

 

© 著作权归作者所有

linuxhunter
粉丝 72
博文 144
码字总数 93264
作品 0
沈阳
高级程序员
私信 提问
cephfs linux kernel client针对superblock操作流程的分析

init_caches() 初始化如下几个cache: cephinodecachep cephcapcachep cephcapflush_cachep cephdentrycachep cephfilecachep cephfs cache ceph_mount() |解析mount options |创建fs client......

linuxhunter
2016/08/10
248
0
ceph的数据存储之路(11)----- cephfs 文件系统

cephfs 文件系统 cephfs 文件系统的使用: 1.首先你要搭建一个ceph集群。如何搭建ceph集群在前面已经介绍过了。如果要使用cephfs文件系统,则必须要有管理文件元数据的mds节点。 2.在集群上创...

一只小江
2016/07/04
9.4K
4
CEPH FILESYSTEM

参考文档: CEPH FILESYSTEM:http://docs.ceph.com/docs/master/cephfs/ CephFS best practices:http://docs.ceph.com/docs/master/cephfs/best-practices/ MDS STAT:http://docs.ceph.co......

Netonline
03/06
0
0
Ceph 之 块设备、文件系统、对象存储的使用

上面左边是我的个人微信,如需进一步沟通,请加微信。 右边是我的公众号“Openstack私有云”,如有兴趣,请关注。 继上篇《Ceph 之 使用ceph-deploy部署ceph集群》,ceph集群搭建完成之后,接...

余伟兵
2018/06/03
0
0
android开发环境搭建,内核编译

搞了三天,终于把这个环境搞出来,一个人摸索,在网上查资料,终于搞定了。但是模拟器跑起来真是慢。 PS: http://developer.android.com/sdk/installing.html https://sourcery.mentor.com...

brucema
2011/11/02
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

HashSet和HashMap有什么区别?

HashSet 底层是采用 HashMap 实现,HashSet 的实现比较简单,HashSet 的绝大部分方法都是通过调用 HashMap 的方法来实现 调用 HashSet 的 add 方法时,实际上是向 HashSet 对象内部持有的 Ha...

ConstXiong
27分钟前
4
0
击穿JVM虚拟机

什么是JVM虚拟机 首先我们需要了解什么是虚拟机,为什么虚拟机可以实现夸平台,虚拟机在计算机中扮演一个什么样的角色。 (从下向上看) 看上图的操作系统与虚拟机层,可以看到,JVM是在操作...

兜兜毛毛
34分钟前
5
0
OpenNMS 利用 Sentinel处理Netflow(流量流向分析)

准备环境 CentOS-7-x86_64 Java8 OpenNMS 23.0.4 minion-23.0.4 sentinel-23.0.4 elasticsearch-6.7.1.tar.gz OpenNMS 配置 1 配置ActiveMQ vi $OPENNMS_HOME/etc/opennms-activemq.xml 取消......

qoswork
38分钟前
5
0
PHP Socket初探---先从一个简单的socket服务器开始

socket的中文名字叫做套接字,这种东西就是对TCP/IP的“封装”。现实中的网络实际上只有四层而已,从上至下分别是应用层、传输层、网络层、数据链路层。最常用的http协议则是属于应用层的协议...

bengozhong
45分钟前
5
0
Git

指令 git init :创建版本库,生成.git文件夹 git add XX:上传代码到暂存区 git state:查看目前本地工作起、暂存区、分支,三者之间的文件状态 git diff demo.html:查看工作区和暂存区的代码...

Hui先生
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部