• 在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,但是这个inode对应的dentry是一定会在的吗?文件名从两个地方去读,一个是目录的数据块,一个是dentry。但是dentry一定会在吗?

    fs/dcache.c: prune_dcache_sb

    在这个函数中,当这个dentry仍然在使用的时候就不会被shrink掉!dentry->d_lockref.count,这个值是啥时候+1呢

    看下page后面的文件系统是啥 page->inode->i_sb->s_type->name

    怎么通过inode得到文件名咧?

    hard_link是啥呀?hark_link是一个inode上面挂了4个dentry,所以从inode,

  • 相关阅读:
    JVM 源码分析
    GGGGCCCC
    正则化(Regularization)、过拟合(Overfitting)
    名校课程
    数据库垂直拆分 水平拆分
    运维角度浅谈MySQL数据库优化
    表的垂直拆分和水平拆分
    Eclipse去掉对JS文件的Validation
    Linux定时任务工具crontab详解及系统时间同步
    高性能分布式哈希表FastDHT
  • 原文地址:https://www.cnblogs.com/honpey/p/8999246.html
Copyright © 2020-2023  润新知