いろいろ確認
稼動確保
できたので確認。ざっくりベースでも良いのでメモ取らないと忘れる、と言いつつざっくりなメモ及びそれを元に整理したナニを投入。
とりあえずバージョン違うんですが、sourceforge の文書にある
ブロックデバイスファイルをオープンすると、各ファイルシステム(ext2など)はメモリiノードの初期化時(read_inode関数)に、ブロックデバイスファイル共通のファイル操作関数テーブルdef_blk_fopsをファイル構造体に登録する。
というナニを手掛りに read_inode を探してみました。
static struct super_operations ext3_sops = {
に read_inode 属性あり (fs/ext3/super.c)
設定されているのは ext3_read_inode() 手続き (fs/ext3/inode.c)。これってきちんと読んで内容精査の必要あり。とりあえず内容精査はスルーで色々確認している。
read_inode() を呼んでいるのは iget() 手続きな模様。
static inline struct inode *iget(struct super_block *sb, unsigned long ino) { struct inode *inode = iget_locked(sb, ino); if (inode && (inode->i_state & I_NEW)) { sb->s_op->read_inode(inode); unlock_new_inode(inode); } return inode; }
include/linux/fs.h にて定義
迷走中
ブロックデバイスの open は open_bdev_execl() ? # block_dev.c にて定義
grep したら fs/super.c からしか呼ばれてない (get_sb_bdev())
と思ったら
- 上記 get_sb_bdev() 手続きは、ext3_get_sb() から呼ばれている (fs/ext3/super.c)
- あるいは ext3_get_sb() は ext3_fs_type の get_sb 属性
で
この、get_sb 属性がどこで使われてるかというと fs/super.c にて vfs_kern_mount() 手続きがあり、そこから以下な形で呼び出し
error = type->get_sb(type, flags, name, data, mnt); if (error < 0) goto out_free_secdata;
vfs_kern_mount() 手続き
同じソース (fs/super.c) の
- do_kern_mount() 手続き
- kern_mount() 手続き
から呼び出されている模様。上記、たぶん mount 時の手続きのはず。
blkdev_inode_operations を探してみるとどうか。# NG
仕方が無いので sourceforge な internal24-index のデバイスファイルなナニの続きを見てみると
ブロックデバイスファイル共通のファイル操作関数テーブルdef_blk_fopsをファイル構造体に登録する。
という記述あり。探してみる。
うーん。。
- def_blk_fops は発見 (fs/block_dev.c)
- fs/inode.c で inode->i_fop に設定してる箇所あり。
- init_special_inode() 手続き。これはどこから呼ばれてる?
- ext3_read_inode() 手続き (fs/ext3/inode.c)
- ext3_mknod() 手続き (fs/ext3/namei.c)
げ。
loop してるし。。
# メモリ i-node の初期化、なキーワードが鍵?
ちなみに
ext3_read_inode() にて
inode->i_blksize = PAGE_SIZE; /* This is the optimal IO size * (for stat), not the fs block * size */
- みたいなナニがある。でもこれって領域確保じゃないのか。。
- inode 構造体の属性チェキが必要かも。(i_blocks 属性?)
とりあえず
ばたばたしててメモも取れてない事が判明。割り込み多いのを言い訳にしたくはないんですが、もう少し腰をスエてきちんと読まないと駄目だ。(とほほほ
とはいえ結局
デバイスファイルを開いた時のナニ、が全然整理できてません。迷走した割に実りナシ。