cephfs linux kernel client针对fscache的操作

原创
2016/08/16 16:49
阅读数 716

针对inode在fscache中操作主要集中在数据结构struct fscache_cookie_def中,具体的数据结构及其操作如下:

static const struct fscache_cookie_def ceph_fscache_inode_object_def = {

        .name           = "CEPH.inode",

        .type           = FSCACHE_COOKIE_TYPE_DATAFILE,

        .get_key        = ceph_fscache_inode_get_key,

        .get_attr       = ceph_fscache_inode_get_attr,

        .get_aux        = ceph_fscache_inode_get_aux,

        .check_aux      = ceph_fscache_inode_check_aux,

        .now_uncached   = ceph_fscache_inode_now_uncached,

};

 

ceph_fscache_inode_get_key(void *cookie_netfs_data, void *buffer, uint16_t maxbuf)    读取struct ceph_inode_info中的i_vino信息到buffer

|__从参数cookie_netfs_data的到struct ceph_inode_info数据结构

|__调用memcpy()将struct ceph_inode_info中的i_vino内容复制到buffer中

 

ceph_fscache_inode_get_attr(void *cookie_netfs_data, uint64_t *size)    读取struct ceph_inode_info中vfs_inode的大小

|__从参数cookie_netfs_data的到struct ceph_inode_info数据结构

|__调用i_size_read()函数读取struct ceph_inode_info中vfs_inode的大小且保存到size中

 

ceph_fscache_inode_get_aux(void *cookie_netfs_data, void *buffer, uint16_t bufmax)

|__从参数cookie_netfs_data的到struct ceph_inode_info数据结构

|__初始化struct ceph_aux_inode信息

|__从struct ceph_inode_info结构中初始化struct ceph_aux_inode信息

|__将struct ceph_aux_inode信息复制到buffer中

 

ceph_fscache_inode_check_aux(void *cookie_netfs_data, void *data, uint16_t dlen)

|__从参数cookie_netfs_data的到struct ceph_inode_info数据结构

|__从struct ceph_inode_info结构中初始化struct ceph_aux_inode信息

|__比较参数中的data和初始化后的struct ceph_aux_inode信息

 

ceph_fscache_inode_now_uncached(void *cookie_netfs_data)

|__从参数cookie_netfs_data的到struct ceph_inode_info数据结构

|__调用pagevec_init()函数初始化pvec

|__调用pagevec_lookup()函数查找struct ceph_inode_info里vfs_inode.i_mapping里所有映射的物理内存页

|__调用ClearPageFsCache()函数清除物理内存页的fscache

|__调用pagevec_release()函数释放pvec

 

ceph_fscache_register_inode_cookie(struct inode *inode)

|__从参数inode中得到struct ceph_inode_info以及struct ceph_fs_client信息

|__调用fscache_acquire_cookie()函数得到访问ceph fscache的cookie值且将该cookie值保存到struct ceph_inode_info的fscache中

 

ceph_fscache_unregister_inode_cookie(struct ceph_inode_info *ci)

|__调用fscache_uncache_all_inode_pages()函数从cache中删除所有inode占用的物理内存页

|__调用fscache_relinquish_cookie()函数删除cookie

 

ceph_fscache_can_enable(void *data)

|__从参数data中得到struct inode数据结构

|__调用inode_is_open_for_write(inode)函数且返回该函数返回值的非

 

ceph_fscache_file_set_cookie(struct inode *inode, struct file *filp)

|__从参数inode得到struct ceph_inode_info数据结构

|__调用fscache_cookie_valid()函数检查struct ceph_inode_info中的fscache是否有效,若无效则直接返回

|__调用inode_is_open_for_write()函数检查inode是打开并可写

    |__调用fscache_disable_cookie()函数禁用cookie

    |__调用fscache_uncache_all_inode_pages()函数删除掉cache中inode的所有物理内存页

|__调用inode_is_open_for_write()函数检查inode是未打开且不可写

    |__调用fscache_enable_cookie()函数启用cookie

 

ceph_fscache_register()

|__调用fscache_register_netfs()函数注册ceph的fscache

 

ceph_fscache_unregister()

|__调用fscache_unregister_netfs()函数注销ceph的fscache

 

ceph_fscache_register_fs(struct ceph_fs_client *fs)

|__调用fscache_acquire_cookie()函数得到访问ceph fscache的cookie值且将该cookie值保存到struct ceph_fs_client的fscache中

 

ceph_fscache_unregister_fs(struct ceph_fs_client *fsc)

|__调用fscache_relinquish_cookie()函数释放fsc->fscache数据结构

 

ceph_fscache_session_get_key(void *cookie_netfs_data, void *buffer, uint16_t maxbuf)

|__从参数cookie_netfs_data的到struct ceph_fs_client数据结构

|__调用memcpy()函数将struct ceph_fs_client数据结构中的client->fsid值复制到buffer中

 

ceph_readpage_from_fscache(struct inode *inode, struct page *page)

|__从参数inode得到struct ceph_inode_info数据结构

|__调用fscache_read_or_alloc_page()函数从fscache中读取inode的内容并写到page中

 

ceph_readpages_from_fscache(struct inode *inode, struct address_space *mapping, struct list_head *pages, unsigned *nr_pages)

|__从参数inode得到struct ceph_inode_info数据结构

|__调用fscache_read_or_alloc_pages()函数从fscahe中读取mapping中的数据并写入到pages中

 

ceph_readpage_to_fscache(struct inode *inode, struct page *page)

|__从参数inode得到struct ceph_inode_info数据结构

|__调用fscache_write_page()函数将物理内存页page中的数据同步到fscache中

 

ceph_invalidate_fscache_page(struct inode *inode, struct page *page)

|__从参数inode得到struct ceph_inode_info数据结构

|__调用fscache_wait_on_page_write()函数等待page写入完成

|__调用fscache_uncache_page()函数将page中的内容从struct ceph_inode_info中的fscache中删除

 

ceph_fscache_revalidate_cookie(struct ceph_inode_info *ci)

|__调用cache_valid()函数检查ci指定的fscache是否有效,若无效

    |__调用fscache_check_consistency()函数校验ci->fscache的一致性,若不一致

        |__调用fscache_invalidate()函数设置ci->fscache无效

    |__设置ci->i_fscache_gen=ci->i_rdcache_gen

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部