在submit_bio处使用stapn

想着在submit_bio的地方,发现在guru模式下,stap是经常性地把内核整挂呀,不得已,也没有发现stap什么比较好的调试方法,所以索性直接使用stap的语法了,但是发现有问题呢,有的时候bv->bv_page->mapping->host, 我发现有的时候,这个地方得到的inode,然后我去解引用一下,竟然会导致失败,是因为bv->bv_page->mapping->host这条路山更有哪里是不合法的吗?有哪里是不合法的吗?

0:cron inode_add(0xffff8800a65fcbb0) ino(0) sector(436275808 +4096)
0:sh inode_add(0xffff8800a65fcbb0) ino(0) sector(176232464 +4096)


抓到了这样两条log,这两条log是说我我这个inode的inode->i_ino竟然是0

只要page在inode就在,inode在dentry就在!有这个结论么?

fs/inode.c函数中:prune_icache_sb

invalidate_mapping_pages,当有lock的page,writeback的page在的时候,读的时候,在submit_bio的地方page是lock的,写的时候这里是writeback的这个inode是不会被清理的,所以在submit_bio处读到的page,可以放心大胆地使用page->mapping->inode,这里有个问题,mapping一定是存在的吗?

这个address_space也是存放在函数

address_space应该是直接嵌入到inode里的一个结构,甚至都不是一个指针,看一下page_cache_get_page函数就可以了,拿一个最简单的f2fs_grab_cache_page来说,当往address_space里加东西的时候,是如何mapping是怎么得到的?

struct address_space *mapping = inode->i_mapping;

这个mappinp就是我们就是inode中嵌入的那个mapping的结构体

在inode初始化的时候:inode->i_mapping = mapping;mapping是怎么赋值的?struct address_space *const mapping = &inode->i_data;

所以只要inode在,那么我们通过page->address_space->host就一定能得到这个文件的inode,zhege

猜你喜欢

转载自www.cnblogs.com/honpey/p/8999246.html
BIO