昨晩の続き
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 限定で出力可能かなぁ。(何