{{{ comment h2w-title:ファイルオフセットからブロック番号への変換 }}} = ファイルオフセットからブロック番号への変換 = #SECTION03780000000000000000 ext2ファイルシステムでは、ext2_getblk関数がファイルオフセットからブロックへの変換処理とデータブロック割り当て処理を同時に行っているが、ページI/Oなどでのvfsが必要とするため、純粋にファイルオフセットに対応するブロック番号を求める処理も用意している。 {{{ ext2_bmap(iノード、オフセット) if(ファイルオフセットが直接ブロックの範囲) データブロックのブロック番号 = inode_bmap(iノード, iノード内のブロック登録エントリ番号); return データブロックのブロック番号; if(ファイルオフセットが一段間接ブロックの範囲) { 間接ブロックのブロック番号 = inode_bmap(iノード, iノード内の間接ブロックの登録エントリ番号); データブロックのブロック番号 = block_getblk(iノード, 間接ブロックのブロック番号, 間接ブロック内のデータブロック登録エントリ番号); return データブロックのブロック番号; } if(ファイルオフセットが二段間接ブロックの範囲) { 一段目の間接ブロックのブロック番号 = inode_bmap(iノード, iノード内の一段目の間接ブロックの登録エントリ番号); 二段目の間接ブロックのブロック番号 = block_getblk(iノード, 一段目間接ブロックのブロック番号, 一段目の間接ブロック内の二段目間接ブロック登録エントリ番号); データブロックのブロック番号 = block_getblk(iノード, 二段目の間接ブロックのブロック番号, 二段目の間接ブロック内のデータブロック登録エントリ番号); return データブロックのブロック番号; } 一段目の間接ブロックのブロック番号 = inode_bmap(iノード, iノード内の一段目の間接ブロックの登録エントリ番号); 二段目の間接ブロックのブロック番号 = block_getblk(iノード, 一段目間接ブロックのブロック番号, 一段目の間接ブロック内の二段目間接ブロック登録エントリ番号); 三段目の間接ブロックのブロック番号 = block_getblk(iノード, 二段目間接ブロックのブロック番号, 二段目の間接ブロック内の三段目間接ブロック登録エントリ番号); データブロックのブロック番号 = block_getblk(iノード, 三段目の間接ブロックのブロック番号, 三段目の間接ブロック内のデータブロック登録エントリ番号); return データブロックのブロック番号; }}} inode_bmap関数は、単純に指定されたメモリiノードの指定されたエントリに登録されているブロック番号を読み出すだけ。block_bmap関数は、単純に指定されたメモリ上の間接ブロックの指定されたエントリに登録されているブロック番号を読み出すだけ。 ---- ''(NIS)HirokazuTakahashi [[BR]]2000年06月11日 (日) 22時29分57秒 JST''