zfs是有两个缓冲区的。首先是dmu buffer,如果dmu buffer中没有数据再找arc buffer,如果找到了,那么就直接调用回调函数,将arc buffer的内容传给dmu buffer。如果再找不到就找磁盘。
具体的实现细节如下:
dbuf_read 首先会看 dmu buffer的状态,如果是UNCACHED。
就会调用 dbuf_read_impl函数。
dbuf_read_impl函数会调用dsl_read,进而从arcbuffer中找数据。找的方法是根据db的db_blkptr来查找。
点击(此处)折叠或打开
- (void) dsl_read(zio, spa, db->db_blkptr, pbuf,
- dbuf_read_done, db, ZIO_PRIORITY_SYNC_READ,
- (*flags & DB_RF_CANFAIL) ? ZIO_FLAG_CANFAIL : ZIO_FLAG_MUSTSUCCEED,