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 の入り組み方は凄いな。