阿弥陀佛
分类: 服务器与存储
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,所以系统会申请一块内存,然后将旧数据复制到该内存中。这样两个脏记录的内容就不同了。