Linuxカーネルのファイルシステムについて調べてみた

概要

kernel-4.4.0のファイルシステムについて、ソースコードをベースに調べてみる。参考書として、詳解 Linuxカーネル 第3版を使用する。

VFS

まずはvfs.hから追ってみたがread()やwrite()が見当たらない…

  1. include/linux/vfs.h
  2. include/linux/statfs.h
  3. include/asm-generic/statfs.h
  4. uapi/asm-generic/statfs.h

と思ったらinclude/linux/fs.hstruct file_operationsなどがあり、その中でread()やwrite()などへの関数ポインタが定義されている。

ext4

fs/ext4/file.cext4_file_operationsが定義されておりそこからext4の実際の処理関数が分かる。ここからはext4のwrite()処理に着目して見ていこうと思う。ext4_file_operationsのwriteメンバはセットされてないためNULLになっていると思われる。writeメンバがNULLのとき、どういった処理が呼び出されるのか調査する。

ext4_file_operationsfs/ext4/inode.cで以下のようにinode->i_fopにセットされている。

i_fopが定義されてるinclude/linux/fs.hstruct inodeで定義されている。

fs/super.cでファイルシステムのスーパーブロックに関する処理を集約しているようである。
mount_fs関数がすべてのファイルシステムをマウントした時に呼ばれる共通関数である。実際にext4をmountした時にバックトーレスをとったらそのようになっていた。mount_fsからさらにext4_mount関数(これはfs/ext4/super.c:ext4_fs_type構造体で指定)が呼びだされ、mount_bdevが呼び出される。

mount_bdev内で各ファイルシステムで定義されているfill_superが呼び出される。ext4の場合は、fs/ext4/super.c:ext4_fill_super関数である。ext4_fill_super関数内でsb->s_opにext4の以下のsuper_operations構造体をセットしている。

ここでセットされているext4_alloc_inode関数が…writeとは話が変わってきそうなので、とりあえずfs/read_write.cを覗いてwriteに関係しそうな処理がないか調べてみる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です