免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1722 | 回复: 1
打印 上一主题 下一主题

[文件系统] 关于文件系统的一些问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-15 23:34 |只看该作者 |倒序浏览
本帖最后由 remaper 于 2013-04-15 23:37 编辑

最近看了几天文件系统相关的代码(刚如行,很菜,问得不好莫怪)。想梳理一下bio被处理的流程
我所看的内核版本是:2.6.34.14

1、plug和unplug的含义没理解(不是什么激活不激活,而是这两个东西的具体角色,所参与的工作,结合流程来分析),plug和unplug的时机分别是什么?
2、从执行submit_bio之后,再到__make_request再到q->request_fn(),整个过程似乎是串行的。当然,__make_request未必会执行q->request_fn(),只有会在下面的情况下,才会触发:
out:
        if (unplug || !queue_should_plug(q))
                __generic_unplug_device(q);
所以又回到了第一个问题。submit_bio就感觉是在攒bio,攒的差不多了就触发了上面的代码,继而会执行q->request_fn()函数。,而q->request_fn是驱动提供的,实际上只是处理了一个request,似乎没别的。
3、在drivers/block/hd.c里,hd的request_queue竟然是一个全局的静态变量,那就是说所有硬盘的bio都会通过同一个队列来处理。
为什么不是一个物理设备,一个request_queque,因为我觉得这样可能并行会更好一点,至少解耦。
4、在block/blk-merge.c的blk_rq_map_sg函数里,new_segment的时候总是:
                        ...
                                sg->page_link &= ~0x02;
                                sg = sg_next(sg);
                        }
                        sg_set_page(sg, bvec->bv_page, nbytes, bvec->bv_offset);

而sg_next(sg)是有可能返回NULL的,但是sg_set_page并没有对sg检查,那内核怎么保证,sg_next返回非NULL?

论坛徽章:
0
2 [报告]
发表于 2013-04-28 21:45 |只看该作者
自己顶啊,求爆虐,求刺激
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP