免费注册 查看新帖 |

Chinaunix

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

[文件系统] 关于write 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
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-12 21:45 |只看该作者 |倒序浏览
30可用积分
from 3.9.4
1.
static ssize_t generic_perform_write(struct file *file,
                                struct iov_iter *i, loff_t pos)
{
...
                copied = iov_iter_copy_from_user_atomic(page, i, offset, bytes);
                if (unlikely(copied == 0)) {<----------为何有不能复制的情况?
                        /*
                         * If we were unable to copy any data at all, we must
                         * fall back to a single segment length write.
                         *
                         * If we didn't fallback here, we could livelock
                         * because not all segments in the iov can be copied at
                         * once without a pagefault.
                         */
                        bytes = min_t(unsigned long, PAGE_CACHE_SIZE - offset,
                                                iov_iter_single_seg_count(i));
                        goto again;
                }
....
}

2.
为何读时有2种方式:基于page和基于缓冲,但是写时仅有基于缓冲的?

3.
调用unmap_underlying_metadata是要处理此块的alias问题,可是为何只对new的bh才做此处理?
觉得只要dirty的都该做此处理啊?可是代码中可见都是判断new,然后做unmap处理!
                        if (buffer_new(bh)) {
                                /* blockdev mappings never come here */
                                clear_buffer_new(bh);
                                unmap_underlying_metadata(bh->b_bdev,
                                                        bh->b_blocknr);
                        }                       
另外,普通文件的读写和块设备之间是否有类似上述alias问题的关联?
因为我觉得:读写普通文件时,应该不会操作块设备的address space啊。。。                    


4.
int __block_write_begin(struct page *page, loff_t pos, unsigned len,
                get_block_t *get_block)
{
...
                if (block_end <= from || block_start >= to) {
                        if (PageUptodate(page)) {
                                if (!buffer_uptodate(bh))
                                        set_buffer_uptodate(bh);<-----------------从page同步到bh的:除了page是新建的case外还有其它case能这么同步么?
                        }
...                  
}

请大家指点下啊,谢谢!

论坛徽章:
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
2 [报告]
发表于 2014-06-03 21:45 |只看该作者
又一年了。。。
连问题都看不懂了。。。

论坛徽章:
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
3 [报告]
发表于 2014-06-05 19:59 |只看该作者
确实不太明白,lz研究的很细,自己搞懂了也分享下嘛~

论坛徽章:
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
4 [报告]
发表于 2014-06-06 09:04 |只看该作者
本帖最后由 humjb_1983 于 2014-06-06 11:22 编辑

为何读时有2种方式:基于page和基于缓冲,但是写时仅有基于缓冲的?
--- 大概找了一下,写时,应该也是两种方式吧~
  1. static int __mpage_writepage(struct page *page, struct writeback_control *wbc,
  2.                       void *data)
  3. {
  4. ...
  5.         bio = mpage_bio_submit(WRITE, bio);
  6. ...
  7. confused:
  8. ...

  9.         if (mpd->use_writepage) {               
  10.                 ret = mapping->a_ops->writepage(page, wbc);
复制代码

论坛徽章:
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
5 [报告]
发表于 2014-06-09 16:13 |只看该作者
回复 4# humjb_1983


    是的,应该是高级的(比如ex4)才支持这样的。
    但是看到的是判断连续性的粒度只能到page,不能到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
6 [报告]
发表于 2014-06-09 16:55 |只看该作者
chishanmingshen 发表于 2014-06-09 16:13
回复 4# humjb_1983

呵呵,代码贴来看看呢~

论坛徽章:
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
7 [报告]
发表于 2014-06-11 09:01 |只看该作者
回复 6# humjb_1983

mpage_prepare_extent_to_map():
                /* If we can't merge this page, we are done. */
            if (mpd->map.m_len > 0 && mpd->next_page != page->index)
                goto out;

论坛徽章:
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
8 [报告]
发表于 2014-06-11 09:37 |只看该作者
奇怪得很,我的代码中还是找不到这个接口。
但判断连续性不只在这判断的吧?block级的连续性判断应该通过page->buffers中的块号来判断的

论坛徽章:
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
9 [报告]
发表于 2014-06-11 09:47 |只看该作者
回复 8# humjb_1983


    是啊,我也没找到,所以觉得在ext4 fs里已经看不到bh号的判断了。
    毕竟那种连续性方式是vfs对io层的优化,可能在写时就没有采用。
   
    (代码看的是最新版本的)

论坛徽章:
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
10 [报告]
发表于 2014-06-11 16:07 |只看该作者
chishanmingshen 发表于 2014-06-11 09:47
回复 8# humjb_1983

我看__mpage_writepage流程中应该是有block连续性判断的~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP