在书中我发现了这个:
- 分配磁盘 inode:设置 inode 位图中的相应位,并将包含该位图的缓冲区标记为脏。此外,如果文件系统已通过指定 MS_SYNCHRONOUS 标志挂载(参见第 12 章的“挂载通用文件系统”一节),则该函数调用 sync_dirty_buffer() 来启动 I/O 写操作并等待操作终止。
这意味着就书籍分配磁盘 inode 而言,只是将 BIT 设置在内存保留的 inode 位图中,并将该位图缓冲区标记为脏。这意味着很快这个位图将被写回存储。
关于 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 }
我不是内核大师,但似乎这个函数只是预读了一些 inode 位图块,它保存了当前的 inode 索引。如评论中所述,这是根据性能提高来完成的。
所以我的理解是,当他们谈论 INODE BLOCK 时,他们指的是在设置特定 inode 位时的位图块。什么时候分配这个块?当你执行 mkfs.ext2。
也许我没听懂这个问题,所以我有一个小补充:如果您询问与此 inode 链接的文件的块分配,那么答案如下:
ext2_get_block() 函数...,调用 ext2_alloc_block() 函数来实际搜索 Ext2 分区中的空闲块。
所以答案然后是 ext2_create -> ... -> ext2_alloc_ block