職場メモ

微妙に修正してこちらにも output。
ネタとしては df と du の数値の根拠とその根拠たる super block なブロック数がいつ更新されるのか、な調査。

df は statfs() を使っている

システムコール内にてどのような手続きが実装されているかを確認。

  • ext3 での statfs() 実装は fs/ext3/super.c にある ext3_statfs() 手続き
    • 引数で渡された dentry オブジェクトから super_block なオブジェクトを取り出す (dentry オブジェクトの d_sb 属性)
    • 取り出した super_block オブジェクトの s_fs_info 属性を取り出す (ext3_sb_info オブジェクト
    • 取り出した ext3_sb_info オブジェクトの s_es 属性を取り出す (ext3_super_block オブジェクト
    • ext3_super_block オブジェクトに s_blocks_count (使用ブロック数) 属性があり、それを返却するオブジェクトに設定
    buf->f_blocks = le32_to_cpu(es->s_blocks_count) - overhead;

という事で ext3 ファイルシステム限定になりますが、使用ブロック数は super_block オブジェクトの属性が使われている事が分かる。

s_blocks_count 属性を変更しているポイント

次に単純に fs/ext3 内で s_blocks_count で grep してみたら s_blocks_count 属性に代入しているは resize.c のみとなっており、以下の手続き。

  • ext3_group_extend()
  • ext3_group_add()

上記手続きの呼び出しを grep で確認したところ、

  • ext3_group_extend() 関数は
    • ioctl.c の ext3_ioctl() 関数から呼び出されている
    • super.c の ext3_remount() 関数から呼び出されている
  • ext3_group_add() 関数は
    • ioctl.c の ext3_ioctl() 関数から呼び出されている

という事から remount 時と ioctl 発行時に属性が変更されていることが類推できる。又、ioctl のコマンド部分について確認が必要 (別途)。

TODO

close() が呼ばれないと上記 ioctl が呼ばれない、という事が分かれば良いのか。sys_close() について確認が必要と思われる。