cephfs kernel client针对dir的inode操作代码

62次阅读
没有评论

共计 4282 个字符,预计需要花费 11 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下 cephfs kernel client 针对 dir 的 inode 操作代码,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

cephfs kernel client 针对 dir 的 inode 操作

const struct inode_operations ceph_dir_iops = {

        .lookup = ceph_lookup,

        .permission = ceph_permission,

        .getattr = ceph_getattr,

        .setattr = ceph_setattr,

        .setxattr = generic_setxattr,

        .getxattr = generic_getxattr,

        .listxattr = ceph_listxattr,

        .removexattr = generic_removexattr,

        .get_acl = ceph_get_acl,

        .set_acl = ceph_set_acl,

        .mknod = ceph_mknod,

        .symlink = ceph_symlink,

        .mkdir = ceph_mkdir,

        .link = ceph_link,

        .unlink = ceph_unlink,

        .rmdir = ceph_unlink,

        .rename = ceph_rename,

        .create = ceph_create,

        .atomic_open = ceph_atomic_open,

};

ceph_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)      查找目录时调用该函数

|__调用 ceph_init_dentry() 函数来初始化 dentry 数据结构,其中包括针对 dentry 的操作集 ceph_dentry_ops

|__设置操作码 op=CEPH_MDS_OP_LOOKUPSNAP 或 CEPH_MDS_OP_LOOKUP

|__调用 ceph_mdsc_create_request() 函数创建一个 mds 请求

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

ceph_permission(struct inode *inode, int mask)      检查 dir 是否有 mask 指定的访问权限

|__调用 ceph_do_getattr() 函数从本地缓存或 mds 集群中得到 CEPH_CAP_AUTH_SHARED 对应的权限

|__调用 generic_permission() 函数做常规的权限检查

ceph_setattr(struct dentry *dentry, struct iattr *attr)      设置文件属性时调用该函数

|__调用__ceph_setattr() 函数

   |__调用 ceph_mdsc_create_request() 函数创建 mds 集群请求

   |__根据设置具体属性的内容如:ATTR_UID/ATTR_GID/ATTR_MODE/ATTR_ATIME/ATTR_MTIME/ATTR_SIZE/ATTR_CTIME 设置请求数据结构中的具体项

   |__调用 ceph_mdsc_do_reqeust() 函数将请求同步发送给 mds 进程

ceph_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)      获取文件属性时调用该函数

|__调用 ceph_do_getattr(CEPH_STAT_CAP_INODE_ALL) 函数从 mds 集群中读取 inode 的所有属性值

|__调用 generic_fillattr() 函数设置通用的属性值到 stat 中

|__将 cephfs 相关的属性值设置到 stat 中

ceph_listxattr(struct dentry *dentry, char *names, size_t size)      列出 inode 的 xattrs 时该函数被调用

|__若 xattrs 的 version 为 0

   |__调用 ceph_do_getattr(CEPH_STAT_CAP_XATTR) 函数从 mds 集群中读取 xattr 信息

|__调用__build_xattrs() 函数创建 xattr 属性

|__调用__copy_xattr_names() 函数将 xattr 属性的所有名字信息复制到 names 数组中

ceph_get_acl(struct inode *inode, int type)    读取 inode 的 acl 信息时调用该函数

|__调用__ceph_getxattr() 函数从 mds 集群中读取 XATTR_NAME_POSIX_ACL_ACCESS 或 XATTR_NAME_POSIX_ACL_DEFUALT 的属性值

|__调用 posix_acl_from_xattr() 函数将 acl 信息读取到内存中的 struct posix_acl 数据结构中

|__调用 ceph_set_cache_acl() 函数将内存中的 struct posix_acl 数据结构写入到 cache 中

ceph_set_acl(struct inode *inode, struct posix_acl *acl, int type)    设置 inode 的 acl 信息时调用该函数

|__调用 posix_acl_xattr_size() 函数得到 xattr 的大小

|__调用 posix_acl_to_xattr() 函数将 acl 转换成 xattr 格式

|__调用__ceph_setxattr() 函数将 acl 转换的 xattr 数据写入到 mds 集群

|__调用 ceph_set_cached_acl() 函数将新的 acl 信息写入到 cache 中

ceph_mknod(struct inode *dir, sturct dentry *dentry, umode_t mode, dev_t rdev)

|__调用 ceph_pre_init_acls() 函数得到 mode 和 struct ceph_acls_info 数据结构内容

|__调用 ceph_mdsc_create_request(CEPH_MDS_OP_MKMOD) 函数创建一个 mds 请求

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

ceph_symlink(struct inode *dir, struct dentry *dentry, const char *dest)

|__调用 ceph_mdsc_create_request(CEPH_MDS_OP_SYMLINK) 函数创建一个 mds 请求

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

ceph_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)

|__得到操作码 op=CEPH_MDS_OP_MKDIR 或者 CEPH_MDS_OP_MKSNAP

|__调用 ceph_mdsc_create_request(op) 函数创建一个 mds 请求

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

|__调用 ceph_init_inode_acls() 函数设置 dentry 对应的 inode 的默认 acls

ceph_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)

|__调用 ceph_mdsc_create_request(CEPH_MDS_OP_LINK) 函数创建一个 mds 请求

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

ceph_unlink(struct inode *dir, struct dentry *dentry)

|__得到操作码 op=CEPH_MDS_OP_RMSNAP 或者 CEPH_MDS_OP_RMDIR 或者 CEPH_MDS_OP_RMLINK

|__调用 ceph_mdsc_create_request(op) 函数创建一个 mds 请求

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

ceph_rename(struct inode *old_inode, struct dentry *old_dentry, struct inode *new_inode, struct dentry *new_dentry)

|__得到操作码 op=CEPH_MDS_OP_RENAME 或者 CEPH_MDS_OP_RENAMESNAP

|__调用 ceph_mdsc_create_request(op) 函数创建一个 mds 请求

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

|__调用 ceph_dir_clear_complete() 函数增加 release 的引用计数

|__调用 d_move() 函数更新内存中的 dentry

|__调用 ceph_invalidate_dentry_lease() 函数刷新 dentry 的 time 和 lease_shared_gen 字段

ceph_create(struct inode *dir, struct dentry *dentry, umode_t mode, bool exel)

|__调用 ceph_mknod() 函数完成目录的创建工作  

ceph_atomic_open(struct inode *dir, struct dentry *dentry, struct file *file, unsigned flags, umode_t mode, int *opened)    lookup+open 在一个 request 中实现

|__调用 ceph_init_dentry() 函数来初始化 dentry 数据结构,其中包括针对 dentry 的操作集 ceph_dentry_ops

|__调用 prepare_open_request() 函数来创建操作码是 CEPH_MDS_OP_CREATE 或者 CEPH_MDS_OP_OPEN 的 mds 请求

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

看完了这篇文章,相信你对“cephfs kernel client 针对 dir 的 inode 操作代码”有了一定的了解,如果想了解更多相关知识,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计4282字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)