***本記事にはプロモーションが含まれています。***
QCOWを何とか動かそうと見ているのですが、なんかすごく難しい。
READだけ見てみると、非同期I/O(AIO)は、2段階のレベルがあります。
外部に公開するインターフェースとしては、bdrv_readとbdrv_aio_readがあります。bdrv_readは同期で、bdrv_aio_readは非同期です。
その下に、ドライバと呼ぶ関数があって、RAW、QCOWなど、形式ごとに読み書きをする関数が用意されています。
RAWフォーマットには、raw_preadが同期で、raw_aio_readが非同期の関数として実装されています。
でも、QCOWフォーマットには、非同期のqcow_aio_readしか実装されていません。それに、QCOWのドライバは、それ自身で読み書きするわけではなく、bdrv_readを介してRAWフォーマットのドライバを呼び出しています。つまり、実質4段階のレベルを通してデータが行き来するという何とも複雑なやり取りをしています。
それだけでなく、同期操作を非同期の関数でエミュレートしたり(bdrv_read_em)、逆に非同期の関数を同期関数でエミューレートする関数bdrv_aio_read_emも存在します。
また、ドライバの呼び出しは、コールバック関数を登録することで行っていて、一体どの関数がいつ呼び出されるのかわかりづらくなっています。
デバッガで追いかけようとしているのですが、Linux上だとデバッグパッチだけでは不十分だったりして、難航しています。