很少有和zfs相关的代码分析,中文的材料基本没有,我来剖析一下zfs的写磁盘的底层的实现吧。
在zio 的流水线当中,有一个流水线的名称为vdev_disk_io_start。
在vdev_disk_io_start(zio *zio)函数中,做了如下的事情:
1.判断zio的请求类型(zio->io_type)
2.根据类型,将zio 传递给__vdev_disk_physio(vd->vd_bdev, zio, zio->io_data,
zio->io_size, zio->io_offset, flags);
在函数 __vdev_disk_physio函数当中,涉及到dio_request 结构体,为了submit_bio的时候使用的对单个请求的包装。
dio_request 请求如下
可以看到dr_bio[]变量为可变的。并且在这个函数当中,给bio进行赋值
点击(此处)折叠或打开
- /*
- * Virtual device vector for disks.
- */
- typedef struct dio_request {
- struct completion dr_comp; /* Completion for sync IO */
- atomic_t dr_ref; /* References */
- zio_t *dr_zio; /* Parent ZIO */
- int dr_rw; /* Read/Write */
- int dr_error; /* Bio error */
- int dr_bio_count; /* Count of bio's */
- struct bio *dr_bio[0]; /* Attached bio's */
- } dio_request_t;
对于zio传下来的参数,可以告诉vdev层,请求的io偏移量,请求的buf指针。以及请求的类型
点击(此处)折叠或打开
- error = __vdev_disk_physio(vd->vd_bdev, zio, zio->io_data,
- zio->io_size, zio->io_offset, flags);
点击(此处)折叠或打开
- static int
- _