免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2345 | 回复: 9

[文件系统] read page时的疑问 [复制链接]

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2013-06-09 23:21 |显示全部楼层
30可用积分
本帖最后由 chishanmingshen 于 2013-06-12 10:46 编辑

static struct bio *
do_mpage_readpage(struct bio *bio, struct page *page, unsigned nr_pages,
                sector_t *last_block_in_bio, struct buffer_head *map_bh,
                unsigned long *first_logical_block, get_block_t get_block)
{
....      
               /* some filesystems will copy data into the page during
                 * the get_block call, in which case we don't want to
                 * read it again.  map_buffer_to_page copies the data
                 * we just collected from get_block into the page's buffers
                 * so readpage doesn't have to repeat the get_block call
                 */
                if (buffer_uptodate(map_bh)) {
                        map_buffer_to_page(page, map_bh, page_block);
                        goto confused;
                }
....

}


求解此段代码含义,哪些fs?谢谢!

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
发表于 2013-06-10 08:34 |显示全部楼层
可以看下 git log,看这段代码是什么时候加入的
另外,可以搜 LKML,看大家对这段代码的讨论,可能可以得到一些信息
具体的,可以看看各个文件系统的 get_block 实现,比如 ext2/3/4 啥的

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
发表于 2013-06-10 08:45 |显示全部楼层
可以看 ext2 的实现
  ext2_get_block -> ext2_get_blocks
里面会有 bh 的创建

这段含义,我理解的是,有的文件系统比如ext2的get_block会在内寸中读入数据
之后使用的时候,就先查找内存中是否有目标block的内存镜像(最新的)
如果有,就不需要再从磁盘读取了
毕竟从磁盘加载到内存中的时间消耗比从内存中直接查找要大

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2013-06-10 12:47 |显示全部楼层
本帖最后由 chishanmingshen 于 2013-06-12 21:46 编辑

回复 3# openspace

谢谢解答!

可是我看了ext2_get_block(),里面只会读取间接块不会读取普通数据块啊。。。


论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2013-06-14 19:33 |显示全部楼层
请大家指点啊,谢谢!

论坛徽章:
0
发表于 2013-10-12 22:59 |显示全部楼层
看一下这篇文章,蛮有借鉴的!!http://oss.org.cn/kernel-book/ch09/9.5.3.htm

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
发表于 2013-10-14 10:37 |显示全部楼层
回复 4# chishanmingshen
个人理解,ext2/3/4(其他文件系统不熟~)在get_block后,都会将数据缓存到buffer中(实际应该是也缓存),读间接块最终还是会将数据缓存到bh中的。



   

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2014-06-01 12:16 |显示全部楼层
本帖最后由 chishanmingshen 于 2014-06-02 11:37 编辑

又一年了。。。

到底哪个fs的get_block里会填充bh->b_data?

再次求解。。。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2014-06-03 21:40 |显示全部楼层
回复 7# humjb_1983


    where? 代码哪里会填充bh的数据?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
发表于 2014-06-05 11:06 |显示全部楼层
不好意思,之前理解有误,ext2_get_block确实只读了间接块,但prepare_write中会判断相关buffer是否mapped并uptodate,如果不是最新的话,会从磁盘读取相应的块。
查了下上面代码中的注释在2.6.11版本中就已经有了,之前的版本我在git主分支中已经找不到记录了,不知还可以从哪里找?~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP