剖析zfs的写磁盘的操作

很少有和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 请求如下

 点击(此处)折叠或打开

  1. /*
  2.  * Virtual device vector for disks.
  3.  */
  4. typedef struct dio_request {
  5.     struct completion    dr_comp;    /* Completion for sync IO */
  6.     atomic_t        dr_ref;        /* References */
  7.     zio_t            *dr_zio;    /* Parent ZIO */
  8.     int            dr_rw;        /* Read/Write */
  9.     int            dr_error;    /* Bio error */
  10.     int            dr_bio_count;    /* Count of bio's */
  11.         struct bio        *dr_bio[0];    /* Attached bio's */
  12. } dio_request_t;
可以看到dr_bio[]变量为可变的。并且在这个函数当中,给bio进行赋值
对于zio传下来的参数,可以告诉vdev层,请求的io偏移量,请求的buf指针。以及请求的类型

点击(此处)折叠或打开

  1. error = __vdev_disk_physio(vd->vd_bdev, zio, zio->io_data,
  2. zio->io_size, zio->io_offset, flags);


点击(此处)折叠或打开

  1. static int
  2. _
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值