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进程
来源:oschina
链接:https://my.oschina.net/u/206258/blog/731753