FreeBSD in FUSE : だいたいの流れメモ

AsiaBSDCon2012 3日目 P6A: FUSE and FreeBSDなるセッションを受けて、FUSEの内部実装を追いかける気力が(FreeBSDに関しては)復活したので軽く流れを追いかけて見るテスト。

対象となるコードは下記のパッチ

RFC: FUSE kernel module for the kernel...
http://lists.freebsd.org/pipermail/freebsd-current/2012-March/032374.html

※ なお、上記パッチは2012/3/8に投稿されたものでありその後RFCへの応答によっては一部書き換わっている可能性があります。


一番の興味がカーネル <-> ユーザランドの通信部分なので、そこのフローを重点的に書き起こしてみる。シナリオはユーザプロセスが、FUSEで作られたファイルシステム(実体はユーザランドのデーモンプロセス)からデータをreadするときにどういうパスをたどるか。基本的な条件として、readはO_DIRECTフラグ付きであると仮定(おいかけるの楽だから)。

エセ・シーケンス図でなんとなく書いてみるとこんな感じ?

ユーザからのI/Oが発生した際はこれをキューに詰み待機、デーモン側での/dev/fuse*へのread時にこれを取得、writeで応答してたたき起こすというフローらしい。