共计 3683 个字符,预计需要花费 10 分钟才能阅读完成。
这篇文章给大家分享的是有关 cephfs kernel client 针对 dir 的 file_operations 操作代码的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。
cephfs kernel client 针对 dir 的 file_operations 操作
const struct file_operations ceph_dir_fops = {
.read = ceph_read_dir,
.iterate = ceph_readdir,
.llseek = ceph_dir_llseek,
.open = ceph_open,
.release = ceph_release,
.unlocked_ioctl = ceph_ioctl,
.fsync = ceph_fsync,
};
ceph_read_dir(struct file *file, char __user *buf, size_t size, loff_t *ppos) 只有在 mount 时带有参数 -o dirstat 时该函数才有效
|__调用 ceph_test_mount_opt() 函数检查 mount options 中是否包含 DIRSTAT,若不包含则直接返回
|__若 struct ceph_file_info 中的 dir_info 为空
|__调用 kmalloc() 函数为 dir_info 分配空间
|__使用 snprintf() 函数向 dir_info 的内存空间进行格式化输出
|__调用 copy_to_user() 函数将 dir_info 中的内容复制到用户态空间 buf 中
ceph_readdir(struct file *file, struct dir_context *ctx)
|__调用 dir_emit() 函数向外发布”.”和”..”信息
|__若 mount options 中包含 DCACHE 则说明应该尽可能的从 dcache 中读取 dir 的信息
|__调用__dcache_readdir() 函数从 dcache 中读取 dir
|__返回值不等于 EAGAIN
|__直接返回
|__调用 need_send_readdir() 函数检查是否应该从集群中读取 dir 的内容
|__得到操作码 op=CEPH_MDS_OP_LSSNAP 或者 CEPH_MDS_OP_READDIR
|__调用 ceph_mdsc_create_request() 函数创建 mds 请求
|__调用 ceph_alloc_readdir_reply_buffer() 函数为从集群中读取到的 dir 内容分配内存空间
|__调用 ceph_mdsc_do_request() 函数将请求同步发送给 mds 进程
|__遍历 struct ceph_file_info- last_readdir- r_reply_info- dir_nr
|__调用 dir_emit() 函数向外发布 dir 信息
ceph_dir_llseek(struct file *file, loff_t offset, int whence)
|__根据 whence 的不同值更新 offset 的值
|__若 offset =0
|__调用 need_reset_readdir() 函数检查是否需要 reset readdir
|__调用 reset_readdir() 函数
|__调整 file- f_pos 值为 offset 值
ceph_open(struct inode *inode, struct file *file) 该函数在打开文件时被调用
|__调用 prepare_open_request() 函数来创建 ceph_mds_request 请求
|__调用 ceph_mdsc_do_request() 函数将 ceph_mds_request 请求同步的发送给 mds 进程
|__调用 ceph_init_file() 函数创建 ceph_file_info 数据结构且将该数据结构放入到 file- private_data 中
ceph_release(struct inode *inode, struct file *file) 该函数在关闭文件时被调用
|__调用 ceph_put_fmode() 函数减少打开文件的引用次数,若引用次数为 0,则从本地 cache 中删除该文件
ceph_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|__根据 cmd 的值做不同的处理
|__cmd==CEPH_IOC_GET_LAYOUT
|__ceph_ioctl_get_layout()
|__ceph_do_getattr(CEPH_STAT_CAP_LAYOUT) 从 mds 集群中读取 file 对应的 inode 的 layout 信息到 ceph_inode_info 的 i_layout 中
|__将 i_layout 信息写入到 struct ceph_ioctl_layout 数据结构中且通过 copy_to_user() 函数将数据返回给用户态
|__cmd==CEPH_IOC_SET_LAYOUT
|__ceph_ioctl_set_layout()
|__调用 copy_from_user() 函数将新的 layout 信息从用户态复制到内核态
|__调用 ceph_do_getattr() 函数从 mds 集群中读取当前的 layout 信息
|__调用__validate_layout() 函数检查新设置的 layout 是否有效
|__调用 ceph_mdsc_create_request() 函数创建 request 请求
|__调用 ceph_mdsc_do_request() 函数同步的发送 request 请求到 mds 集群
|__cmd==CEPH_IOC_SET_LAYOUT_POLICY
|__ceph_ioctl_set_layout_policy()
|__调用 copy_from_user() 函数将新的 layout 信息从用户态复制到内核态
|__调用__validate_layout() 函数检查新设置的 layout 是否有效
|__调用 ceph_mdsc_create_request() 函数创建 request 请求
|__调用 ceph_mdsc_do_request() 函数同步的发送 request 请求到 mds 集群
|__cmd==CEPH_IOC_GET_DATALOC 计算 data 所在的 ceph 集群中的位置信息
|__ceph_ioctl_get_dataloc()
|__调用 copy_from_user() 函数将 ceph_ioctl_dataloc 信息复制到内核态
|__调用 ceph_calc_file_object_mapping() 函数计算 ceph_ioctl_dataloc 信息中指定文件所在的 oid 等信息
|__调用 ceph_object_locator_to_pg() 函数计算出 oid 所在的 pg 信息
|__调用 ceph_pg_to_acting_primary() 函数计算出 pg 所在的主 osd 信息
|__调用 copy_to_user() 函数将计算出来的信息发送回给用户态
|__cmd==CEPH_IOC_LAZYIO 设置 LAZYIO 标识
|__ceph_ioctl_lazyio()
|__ 判断 struct ceph_file_info 中的 fmode 是否未设置 CEPH_FILE_MODE_LAZY
|__设置 struct ceph_file_info 中的 fmode 拥有 CEPH_FILE_MODE_LAZY 标识
|__更新 ceph_inode_info 中的 i_nr_by_mode 数组
|__调用 ceph_check_caps() 函数更新 caps
|__cmd==CEPH_IOC_SYNCIO
|__ceph_ioctl_syncio()
|__设置 struct ceph_file_info 结构中的 flags 的 CEPH_F_SYNC 位
ceph_fsync(struct file *file, loff_t start , loff_t end, int datasync)
|__调用 ceph_sync_write_wait() 函数等待 inode 上所有未完成的 osd 请求执行完毕
|__调用 try_flush_caps() 函数将所有 dirty 的 caps 刷回到 mds
|__调用 unsafe_request_wait() 函数等待 inode 上所有针对 mds 请求执行完毕
感谢各位的阅读!关于“cephfs kernel client 针对 dir 的 file_operations 操作代码”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!