tarfs について (6)
firefox3 で自分のエントリのコードの部分が見えん。仕方が無いので w3m で確認。で、set_blocksize() がどこで定義されているのかを忘れている上に、直前エントリには記述が無い。
とほほほ、と言いつつ find|xargs grep で探してみると fs/block_dev.c との事。もう少し set_blocksize() あたりを見てみる事に。
struct block_device 型
2.4 な set_blocksize() だと引数で渡される kdev_t な dev で以下のようにナニ。
/* Ok, we're actually changing the blocksize.. */ bdev = bdget(dev); sync_buffers(dev, 2); blksize_size[MAJOR(dev)][MINOR(dev)] = size; bdev->bd_inode->i_blkbits = blksize_bits(size); kill_bdev(bdev); bdput(bdev);
上記 bdev は struct block_device 型へのポインタ。細かい部分で微妙に違いますが、bdget() で取得するよりも struct super_block 型の属性にしちまえ、なソレなのだろうと類推。
2.6.20 なナニは以下になっている。
/* Don't change the size if it is same as current */ if (bdev->bd_block_size != size) { sync_blockdev(bdev); bdev->bd_block_size = size; bdev->bd_inode->i_blkbits = blksize_bits(size); kill_bdev(bdev); }
こちらは直前エントリでも書いた通り、set_blocksize() な引数で渡ってくるのは struct block_device 型の bdev となっている。ヤッてる事的にはいっちゃん最後の kill_bdev() の呼び出し以外はさほど変わらなさそげに見えます。
次
上記は別途掘る事にしとくとして直前エントリで見てみたいと思った tarfs_sops なんですが、定義は super.c にて以下。
static struct super_operations tarfs_sops = { read_inode: tarfs_read_inode, put_super: tarfs_put_super, statfs: tarfs_statfs, remount_fs: tarfs_remount, };
struct super_oprations 型の上記の属性に関する Linux カーネル 2.6 解読室な記述を引用してみると以下
- read_inode : i ノードのディスクからの読み込み
- put_super : super_block の参照カウントダウン時の処理を定義
- statfs : ファイルシステムの情報取得
- remount_fs : ファイルシステムの remount
テキストを見てみると上記の属性については詳細な説明の記述あり。put_super 属性はスーパーブロック削除時の処理な模様。
とほほ
とりあえず github あたりにソースツリーを登録して、2.6 なソレで make しながら云々の方が良いのかこつこつ読むのが良いのか悩み中。両方いっぺんにデキれば良いのでしょうが、読んでるだけでこの gdgd っぷりだしなぁ。