ext3_fill_super() 手続き (5)
ちょっと元に戻ってみる。そもそも fs/super.c にて定義されてる get_sb_bdev() を掘じくり返してるのは標題の手続きが渡されている ext3_get_sb() から呼び出されているのが get_sb_bdev() だから、ですね。
ちなみに、冗長かと思われますが get_sb() 手続き呼び出しに至る route としては
do_kern_mount()#fs/super.c vfs_kern_mount()#fs/super.c get_sb()
または
kern_mount()#fs/super.c vfs_kern_mount()#fs/super.c get_sb()
な模様。do_kern_mount() とかって namespace.c あたりからしか呼び出されていない模様。逆に kern_mount() 方面は若干微妙かも。
で、3rd Edition の 12.4 あたりに do_mount() 手続きが do_kern_mount() を呼び出す件の記述があるな。
閑話休題
get_sb_bdev() 手続きからの open_bdev_excl() の呼び出しは以下なカンジ。
bdev = open_bdev_excl(dev_name, flags, fs_type);
この手続きは 3rd Edition によれば_dev_name で指定されたデバイスファイル名を持つブロック型デバイスをオープンします_とあります。この_オープンされた状態_というのはどういった状態を指すのか、という事をきちんと確認する必要あり。
と、いう事で
open_bdev_excl() に戻るんだな。ここ、何をしてるのか俯瞰的な確認が必要と見てます。しかし具体的にどうしたものやら。
余裕があれば追記予定です。
追記
lookup_bdev() 関連にてポイントをいくつか控え。
- path_lookup() 手続きは第三引数で渡す nameidata なポインタにオブジェクトがセット
- dentry と mnt メンバが指定したパス名に対応するファイルを表現
- path_lookup() で確保された dentry と vfsmount なオブジェクトは path_release() が呼び出されるまで解放されては駄目
3rd Edition の 12.5 はソース見つつ、な確認必要かと。