zfs同步机制 到了zio之后,就很难从代码上进行跟踪了。今天解决了困扰自己数月的问题。
对于间接块而言,必须要先同步叶子节点,即该间接块的叶子节点必须申请完新写入的空间,才可以同步他自己。当间接块的zio开始进入zio_write_bp_init流水线的时候,会发现这个时候叶子节点还没有进入zio_ready状态。那么通过函数
就会提前退出流水线,直到这个间接块的叶子节点申请完块,进入zio_ready状态的时候,他才开始申请块,这样一级一级的等待,直到dnode的最上层的zio被执行,整个的dnode才完成了同步。
对于间接块而言,必须要先同步叶子节点,即该间接块的叶子节点必须申请完新写入的空间,才可以同步他自己。当间接块的zio开始进入zio_write_bp_init流水线的时候,会发现这个时候叶子节点还没有进入zio_ready状态。那么通过函数
点击(此处)折叠或打开
- zio_wait_for_children(zio_t *zio, enum zio_child child, enum zio_wait_type wait)
就会提前退出流水线,直到这个间接块的叶子节点申请完块,进入zio_ready状态的时候,他才开始申请块,这样一级一级的等待,直到dnode的最上层的zio被执行,整个的dnode才完成了同步。