昨晩の続き

super.c で free_blocks で探したら最初に見つかるのが ext3_check_descriptors() 手続きの中の以下の命令。

	sbi->s_es->s_free_blocks_count=cpu_to_le32(ext3_count_free_blocks(sb));

上記が何をしているのか、は別途。とりあえずこの手続きを呼び出している箇所を特定。grep で探したら super.c から一箇所存在。
ext3_fill_super() 手続きの以下の部分。

	if (!ext3_check_descriptors (sb)) {
		printk(KERN_ERR "EXT3-fs: group descriptors corrupted!\n");
		goto failed_mount2;
	}

fs/ext3/ の中のソースではこの手続きは get_sb_bdev() に渡されてます。

static int ext3_get_sb(struct file_system_type *fs_type,
	int flags, const char *dev_name, void *data, struct vfsmount *mnt)
{
	return get_sb_bdev(fs_type, flags, dev_name, data, ext3_fill_super, mnt);
}

む。get_sb って mount する時にナニ?
# ココに出てきてますな

ext3_count_free_blocks() 手続き。balloc.c にて定義。こんなコメントがナニ。

/**
 * ext3_count_free_blocks() -- count filesystem free blocks
 * @sb:		superblock
 *
 * Adds up the number of free blocks from each block group.
 */

処理の核心は以下。

	ext3_fsblk_t desc_count;
	struct ext3_group_desc *gdp;
	int i;
	unsigned long ngroups = EXT3_SB(sb)->s_groups_count;

	desc_count = 0;
	smp_rmb();
	for (i = 0; i < ngroups; i++) {
		gdp = ext3_get_group_desc(sb, i, NULL);
		if (!gdp)
			continue;
		desc_count += le16_to_cpu(gdp->bg_free_blocks_count);
	}

	return desc_count;

このあたり、掘りはじめると面白いんでしょうが、かなりリキが無い。ext3_get_group_desc() 手続きの中身を見ても、ぱっと見で bg_free_blocks_count に free blocks な数が格納されてるのかは分からず。
これはちょっと参考書の確認が必要ですな。

kill_sb なんですが昨晩エントリの続き。file_system_type 構造体の kill_sb 属性な関数ポインタが呼び出される deactivate_super() 手続きですが、fs/super.c 内で呼び出されている模様。以下に列挙。

  • get_sb_bdev() 手続き
    • これは mount 時に呼ばれるソレですな
  • get_sb_nodev() 手続き
  • get_sb_single() 手続き
  • vfs_kern_mount() 手続き

あ、get_sb_bdev() の中で deactivate_super() が呼ばれるのはエラーケイスですね。ちょっと頭がこんがらがりそうになってしまいました。
色々ざくざく掘ってますが、全然整理ができてない。

sys_close() を再確認

コールグラフちっくなナニを以下に。(sys_close() を掘ってみるより)

sys_close()
 filp_close()
  fput()
   __fput()
    mntput()
     mntput_no_expire()
      __mntput()
       deactivate_super()

fs->kill_sb() が上記の deactivate_super() から呼び出されている。
で、kill_sb に格納されている kill_block_super() から呼び出されている generic_shutdown_super() において

		if (sop->put_super)
			sop->put_super(sb);

なナニがあって、ext3_put_super() からは ext3_commit_super() が呼び出されて s_free_blocks_count な属性がリセットされている模様。
これで ext3 限定で出力可能かなぁ。(何