tarfs について (12)
ええと、完全スルーだったのですが、記事の記述
何かするたびに tar アーカイブ自体を読みにいっていては大変なので、マウント時に「(アーカイブ内での) データ位置、サイズ、作成時期などなど」の情報をメモリ中に読み込んでしまうことにします。
という記述があるので、どっかで何かしてるんだろうな、と言いつつその根拠が微妙でした。あるいは同じページにて
今回の実装では、iget() でルート i ノードに対応する i ノードを取得しようとしたタイミングで、前述の parse_tar() を用いて tar アーカイブからディレクトリ情報を読み込んでいます。
との事。mount した時に呼ばれるハズの tarfs_read_super() なナニで何とかしてるはず、というのは理解できたのですがその根拠が微妙でした。
で、とりあえず色々調べてたんですが順にナニ
tarfs_read_super 手続き
これが mount 時に呼び出されるナニ。核心は以下
sb->s_root = d_alloc_root(iget(sb, TARFS_ROOT_INO));
d_alloc_root についてはインターネット方面に材料あり。
iget の定義は直前エントリの通りで、ソコから struct supre_block 型なオブジェクトの s_op にセットされてるオブジェクトの read_inode 属性な関数を呼び出す模様。
ちなみにココにセットされてるのは tarfs_read_inode() 手続きです。inode.c にて定義。ここで lookup_tarent() が呼び出されています。
ent=lookup_tarent(inode->i_sb, inode->i_ino);
で、ようやくココで引用したナニな処理があった。結構探すのに時間がかかりました。特に iget() (ry
以下が lookup_tarent() の核心の部分
if (!TARSB(sb)->parsed){ message("tarfs: !!! sb->parsed == 0\n"); if (parse_tar(sb)) goto err_out; TARSB(sb)->parsed=1; }
parsed な属性がスイッチになってて parse_tar() がナニ。tarent.c にて定義されてます。まずこっちを確認すべき、という事で。
しかし
流石にこの interface の入り組み方は凄いな。