Linux kernel 何时为新创建的ext2 inode分配存储?
我正在学习如何在ext2fs上创建新的常规文件。Linux kernel 何时为新创建的ext2 inode分配存储?,linux-kernel,filesystems,inode,ext3,ext2,Linux Kernel,Filesystems,Inode,Ext3,Ext2,我正在学习如何在ext2fs上创建新的常规文件。 (这本书在多个地方:不确定它们的合法性。只是相关章节的更新版本在-但它没有所有相关数据) 在我看来,Linux内核必须创建一个新的inode,并为其分配必要的块。 报告概述了以下程序: 创建索引节点(第758页) 分配数据块(第764页) 我不明白的是内核什么时候分配新inode的数据块。 在创建inode过程的末尾(第14段),我看到了以下内容: 调用ext2\u preread\u inode()从包含 inode和将块放入页面缓存。这种
(这本书在多个地方:不确定它们的合法性。只是相关章节的更新版本在-但它没有所有相关数据) 在我看来,Linux内核必须创建一个新的inode,并为其分配必要的块。 报告概述了以下程序:
(第758页)创建索引节点
(第764页)分配数据块
在
创建inode
过程的末尾(第14段),我看到了以下内容:
调用ext2\u preread\u inode()
从包含
inode和将块放入页面缓存。这种
执行预读是因为最近创建的inode可能
很快就会回信的
所以,就在这之前——在我看来,这是分配inode块的合理位置。然而,ext2架构师可能决定在不同的时间进行分配
有人知道什么时候为新创建的ext2 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块时,他们指的是设置了特定INODE位的位图块。这个街区什么时候分配?执行mkfs.ext2时
也许我没听清楚这个问题,所以我补充了一点:
如果您询问与此inode链接的文件的块分配,则答案如下:
ext2_get_block()函数调用ext2_alloc_block()
函数来实际搜索Ext2分区中的空闲块
所以答案是ext2\u create->…->ext2_alloc_块IIRC,在现代编译器上,答案是“从磁盘缓存刷新文件时”。这可能出现得很晚,但请记住,ext2试图避免碎片。如果您可以延迟块的分配,直到整个文件都在磁盘缓存中,那么您就可以确切地知道它有多大,并且可以分配一个连续的块 我不是100%确定,但我认为块分配过程在新inode函数中的位置可以通过查看第581行([)的源代码来确定。也就是说,在更新acl(
err=ext2\u init\u acl(inode,dir)之前调用存储块的分配(err=dquot\u alloc\u inode(inode);
)
)现在的问题是什么?如果
我读的资料是正确的,那么问题就解决了。