get_block()ハンドラ
1. 概要
ファイルシステム各所から使われるget_block()ハンドラに関するメモ。
get_block()はファイルの指定ブロックがディスク上のどのブロックにマップされているかを取得するためのハンドラ。
2. get_block()の動作
[get_blockのプロトタイプ]
get_block(inode, iblock, bh_result ,create)
get_blockはinodeで示すオブジェクト(ファイル等)のiblock番目のブロックの位置を取得する。位置とはどのブロックデバイスのどのブロックか?ということ。この位置は、bh_resultに設定されて返される。具体的には、b_bdev,b_blocknrを設定してBH_Mapをセットして返す(図1)。
図1 get_block()の返すbh_result
指定ブロックがディスク上にまだなければ、エラーを返す。ただし、create = 1で呼び出された時は新たにディスクブロックを割り当ててそこにマップしてbh_resultが返される。
指定ブロックがディスク上のどこに存在するかは、ファイルシステムに依存するのでget_block()処理は各ファイルシステム毎に存在する。このため、正確にはget_block()というルーチンは存在しない。ファイルシステム処理では各ファイルシステム毎のget_blockハンドラ(例えばExt2FSではext2_get_block())を関数ポインタget_blockに格納して、適宜対応するファイルシステムに処理させるようになっている。