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 のファイルシステム周辺をがっつり読む必要ありッスね。