__block_commit_write 和bdflush 发生竞态怎么办?

aweii 2017-04-02 10:09:14
最近读2.4.18内核的文件和缓冲区高速缓存部分时。有了一个疑问。比如其中的一段代码:
ssize_t
generic_file_write(struct file *file,const char *buf,size_t count, loff_t *ppos)
{
……
status = mapping->a_ops->prepare_write(file, page, offset, offset+bytes);
if (status)
goto sync_failure;
page_fault = __copy_from_user(kaddr+offset, buf, bytes);
flush_dcache_page(page);
status = mapping->a_ops->commit_write(file, page, offset, offset+bytes);
……
}
假设页的其中一个缓冲区正被bdflush提交给块设备写出的时候, 与此同时__copy_from_user(kaddr+offset, buf, bytes); 写缓冲区
发生竞态怎么办?这段代码没有检查buffer的LOCK情况。
...全文
413 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
aweii 2017-04-02
  • 打赏
  • 举报
回复
可以假设这个块此前已经脏过一次,bdflush提交的时候正好一个进程又启动写操作,缓冲区在写入磁盘的同时__copy_from_user使缓冲区内容发生变化。这种情景可能发生吗?

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧