Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1907101
  • 博文数量: 211
  • 博客积分: 464
  • 博客等级: 下士
  • 技术积分: 3794
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-24 18:25
个人简介

阿弥陀佛

文章分类

全部博文(211)

文章存档

2020年(2)

2019年(3)

2018年(5)

2017年(6)

2016年(10)

2015年(9)

2014年(73)

2013年(90)

2012年(13)

分类: 服务器与存储

2013-02-27 15:15:44

zvol 共32个线程,一起来完成处理request的操作。从bio当中向dbuf中写入数据。

根据request中的offset 和 length。zvol调用dbuf_hold 来查找该dbuf,如果没有就创建dbuf。

下面要写dbuf了。

   共有两种情况:1.全块写 2.部分写

对于全块写,dbuf先从arc 的cache当中申请内存,放入到db->dbuf当中。此时 dbuf和 db->db.db_data是一样的。然后创建一个脏记录,让脏记录的指针指向db->dbuf(刚刚从arc中申请的缓冲区)。并递归的将它的父dbuf标记为脏。

对于部分写,dbuf如果是UNCACHED的状态,就从arc中读,如果arc中没有,再从磁盘上读,读完之后db->dbuf中的内容就是刚刚读过的内容了。然后创建一个脏记录,让脏记录指向dbuf当中(此时db->dbuf已经和arc已经脱离了关系,也就是说不会被arc层使用了,因为脏记录要被同步)。


也就是说无论是全块写还是部分写,在该txg内,已经创建了一个dr,那么就不创建dr了,而且也不用再从arc中申请了,直接将数据写入到dbuf层中即可。

如果在下一个txg,又发生了全块写操作或者部分写操作,那么就需要创建另一个dr了,此时dbuf中含有两个dr,为了不影响上一个txg的dr,所以系统会申请一块内存,然后将旧数据复制到该内存中。这样两个脏记录的内容就不同了。

阅读(2710) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~