s_free_blocks_count 確認
grep してみた。fs/ext3 の中。
$ grep s_free_blocks_count fs/ext3/* fs/ext3/balloc.c: le32_to_cpu(es->s_free_blocks_count), fs/ext3/super.c: sbi->s_es->s_free_blocks_count=cpu_to_le32(ext3_count_free_blocks(sb)); fs/ext3/super.c: es->s_free_blocks_count = cpu_to_le32(ext3_count_free_blocks(sb)); $
代入しとるのは super.c の中のみな模様。確認してみると
- ext3_check_descriptors() 手続き
- ext3_commit_super() 手続き
な模様。ext3_commit_super() は close() なナニから呼び出されるんですが他からどうか、も確認必要そげ。あと、ext3_check_descriptors() は関数定義のてっぺんで以下なコメントが書かれてます。
/* Called at mount-time, super-block is locked */
む。
こんなのがある。
percpu_counter_init(&sbi->s_freeblocks_counter, ext3_count_free_blocks(sb));
ext3_fill_super() 手続きの中です。
上記は一旦スルー
grep で手続きが呼び出されている箇所の確認。まず ext3_commit_super() から
$ grep ext3_commit_super *.c super.c:static void ext3_commit_super (struct super_block * sb, super.c: ext3_commit_super(sb, es, 1); super.c: ext3_commit_super(sb, es, 1); super.c: ext3_commit_super(sb, es, 1); super.c: ext3_commit_super(sb, es, 1); super.c: ext3_commit_super(sb, es, 1); super.c:static void ext3_commit_super (struct super_block * sb, super.c: ext3_commit_super(sb, es, 1); super.c: ext3_commit_super (sb, es, 1); super.c: ext3_commit_super(sb, EXT3_SB(sb)->s_es, 1); super.c: ext3_commit_super(sb, EXT3_SB(sb)->s_es, 1); $
あらら。結構多いな。基本全部 super.c です。
- ext3_handle_error()
- ext3_put_super()
- ext3_setup_super()
- ext3_load_journal()
- ext3_create_journal()
- ext3_mark_recovery_complete()
- ext3_clear_journal_err()
- ext3_write_super_lockfs()
- ext3_unlockfs()
あら?
ext3_sb_info 構造体のメンバにも s_freeblocks_counter という名前の属性があるんですな。ext3_fill_super() 手続きのソレでも出てきてます。むむむ。
ってよく考えたら ext3_commit_super() というかおそらく ext3_put_super() 手続きは close() 以外のタイミングでも呼ばれてるような気がしてきた。grep したらソレっぽい呼び出しが数カ所。
../super.c: if (sop->put_super) ../super.c: sop->put_super(sb);
fs/super.c 見てみたら generic_shutdown_super() からのみ。これを呼び出しているのは
- kill_anon_super()
- kill_block_super()
から呼び出され。kill_block_super() は file_system_type なオブジェクトの kill_db な属性にセットされてるケイス多し。以下は ext3_fs_type オブジェクトの例
static struct file_system_type ext3_fs_type = { .owner = THIS_MODULE, .name = "ext3", .get_sb = ext3_get_sb, .kill_sb = kill_block_super, .fs_flags = FS_REQUIRES_DEV, };
ちなみにこの kill_sb 属性は fs/super.c の deactivate_super() 手続きから呼び出されております。関数定義のコメントが以下。
/** * deactivate_super - drop an active reference to superblock * @s: superblock to deactivate * * Drops an active reference to superblock, acquiring a temprory one if * there is no active references left. In that case we lock superblock, * tell fs driver to shut it down and drop the temporary reference we * had just acquired. */
うーん ...
このあたりまだまだ確認必要そげ。3rd Edition のファイルシステム周辺をがっつり読む必要ありッスね。