tarfs 関連

ログを確認してみる必要あり。脳が退化してちょっと前のログもリハビリが必要。
と言いつつ parse_tar() を見ようとしてて、何故に iget() に jmp したのか自分でも不明。もう少し見てみます。

順を追って見てみるに

  • tarfs_read_super() 手続き
    • struct file_system_type 型の tar_fs_type の get_sb 属性に設定
    • get_sb 属性に設定される手続きは mount 時に呼び出される

で、この手続きの核心が

  sb->s_root = d_alloc_root(iget(sb, TARFS_ROOT_INO));

と記述している。_核心_が本当かどうかは微妙なんですが ...
で、d_alloc_root() 手続きは d_alloc_root()/linux2.6 によれば fs/dcache.c にて定義されてて、_ルートディレクトリエントリを確保する_とある。
ここで iget() 手続きが出てきて云々なのはええんですが、parse_tar() 手続きはどこに行ったんでしょうか。

成程

d_alloc_root に渡される iget() 手続きの戻り値なんですが iget() 手続きの呼び出しによって

sb->s_op->read_inode(inode);

がナニされるんですが、s_op 属性にセットしているのが super.c の tarfs_read_super() 手続きで

  sb->s_op = &tarfs_sops;

tarfs_sops も super.c にて定義されてて以下

static struct super_operations tarfs_sops = {
	read_inode:	tarfs_read_inode,
	put_super:	tarfs_put_super,
	statfs:		tarfs_statfs,
	remount_fs:	tarfs_remount,
};

read_inode 属性には tarfs_read_inode() 手続きのポインタが設定されている。ので、iget() 手続きから inode.c で定義されてる件の手続きが呼ばれる事になるはず。で、この手続きの中の冒頭にある以下の部分

void tarfs_read_inode (struct inode * inode)
{
  struct tarent *ent;

  message("tarfs: tarfs_read_inode(ino=%ld)\n", inode->i_ino);

  ent=lookup_tarent(inode->i_sb, inode->i_ino);
  if (!ent)
    goto err_out;

の lookup_tarent() 手続きがカギ。手がダルいので tarfs について (12) なポインタで勘弁して下さい、なのですが、この中で

  if (!TARSB(sb)->parsed){
    message("tarfs: !!! sb->parsed == 0\n");
    if (parse_tar(sb))
      goto err_out;
    TARSB(sb)->parsed=1;
  }

みたいな形で parse_tar() 手続きを呼び出している、と。

parse_tar() 手続きを見る前に i_get() 手続きを、という流れだったに違いない。で、i_get() を掘り中に道に迷った模様。もっかいヤり直した方が良さげ。エントリ自分で見ても話がスッ飛び杉でよく分からんのは問題ではないかと。