本で私はこれを見つけました:
- ディスク i ノードを割り当てます。対応するビットを i ノード ビットマップに設定し、ビットマップを含むバッファをダーティとしてマークします。さらに、ファイルシステムが MS_SYNCHRONOUS フラグを指定してマウントされている場合 (第 12 章のセクション「汎用ファイルシステムのマウント」を参照)、関数は sync_dirty_buffer( ) を呼び出して I/O 書き込み操作を開始し、操作が終了するまで待機します。
つまり、ディスク i ノードを割り当てることは、メモリに保持された i ノード ビットマップに BIT を設定し、このビットマップ バッファをダーティとしてマークすることを意味します。これは、すぐにこのビットマップがストレージに書き戻されることを意味します。
ext2_preread_inode() について、コードは次のとおりです。
static void ext2_preread_inode(struct inode *inode)
166 {
167 unsigned long block_group;
168 unsigned long offset;
169 unsigned long block;
170 struct ext2_group_desc * gdp;
171 struct backing_dev_info *bdi;
172
173 bdi = inode->i_mapping->backing_dev_info;
174 if (bdi_read_congested(bdi))
175 return;
176 if (bdi_write_congested(bdi))
177 return;
178
179 block_group = (inode->i_ino - 1) / EXT2_INODES_PER_GROUP(inode->i_sb);
180 gdp = ext2_get_group_desc(inode->i_sb, block_group, NULL);
181 if (gdp == NULL)
182 return;
183
184 /*
185 * Figure out the offset within the block group inode table
186 */
187 offset = ((inode->i_ino - 1) % EXT2_INODES_PER_GROUP(inode->i_sb)) *
188 EXT2_INODE_SIZE(inode->i_sb);
189 block = le32_to_cpu(gdp->bg_inode_table) +
190 (offset >> EXT2_BLOCK_SIZE_BITS(inode->i_sb));
191 sb_breadahead(inode->i_sb, block);
192 }
私はカーネル マスターではありませんが、この関数は、現在の i ノード インデックスを保持する i ノード ビットマップの一部のブロックを先読みしているようです。これは、コメントで述べたように、パフォーマンスの向上という観点から行われます。
したがって、私の理解では、彼らが INODE BLOCK について話すとき、特定の inode ビットが設定されているときのビットマップのブロックを意味するということです。このブロックはいつ割り当てられますか? mkfs.ext2 を実行すると。
たぶん私は質問をキャッチできなかったので、少し追加があります: この i ノードにリンクされたファイルのブロックの割り当てについて質問している場合、答えは次のとおりです。
ext2_get_block() 関数は ...、ext2_alloc_block( ) 関数を呼び出して、Ext2 パーティション内の空きブロックを実際に検索します。
答えは ext2_create -> ... -> ext2_alloc_ block