何时为新创建的 ext2 inode 分配存储空间?

Posted

技术标签:

【中文标题】何时为新创建的 ext2 inode 分配存储空间?【英文标题】:When is storage allocated for a newly created ext2 inode? 【发布时间】:2014-12-10 20:32:35 【问题描述】:

我正在阅读Understanding the Linux Kernel, 3rd Edition,了解如何在 ext2fs 上创建新的常规文件。 (书在多个地方是available online:不确定它们的合法性。相关章节的更新版本在O'reilly's site - 但它没有所有相关数据)

在我看来,Linux 内核必须创建一个新的 inode,并为其分配必要的块。

book 概述了以下过程:

Creating inodes(第 758 页) Allocating a Data Block(第 764 页)

我不明白的是什么时候内核会分配新的inode的数据块。

Creating inodes 过程接近尾声(第 14 段)时,我看到以下内容:

调用ext2_preread_inode() 从磁盘读取包含的块 inode 并将块放入页面缓存中。这类 预读已完成,因为很可能最近创建的 inode 很快就会写回来。

所以,就在那之前 - 在我看来,分配 inode 块的逻辑位置。但是,可能是 ext2 架构师决定在不同的时间进行分配。

有人知道何时为新创建的 ext2 inode 分配存储空间吗?

【问题讨论】:

【参考方案1】:

IIRC,在现代编译器上,答案是“从磁盘缓存中刷新文件时”。这可能看起来很晚,但请记住 ext2 试图避免碎片。如果您可以延迟块的分配,直到整个文件都在磁盘缓存中,您就可以准确地知道它有多大并且可以分配一个连续的块。

【讨论】:

【参考方案2】:

在书中我发现了这个:

    分配磁盘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 索引。这是在 cmets 中提到的性能提升方面完成的。

所以我的理解是,当他们谈论 INODE BLOCK 时,他们的意思是在设置特定 inode 位时的位图块。什么时候分配这个块?当你执行 mkfs.ext2.

也许我没听懂这个问题,所以我有一点补充: 如果您询问与此 inode 链接的文件的块分配,则答案如下:

ext2_get_block() 函数...,调用 ext2_alloc_block() 函数在 Ext2 分区中实际搜索空闲块。

所以答案然后是 ext2_create -> ... -> ext2_alloc_ 块

【讨论】:

我不是 100% 确定,但我认为 blocks 分配过程 的位置,在 new inode 函数中可能 可以通过查看第 581 行 ([lxr.free-electrons.com/source/fs/ext2/ialloc.c#L581]) 的来源来确定。即,存储块分配(err = dquot_alloc_inode(inode);)在 ACL 更新之前调用(err = ext2_init_acl(inode, dir); 现在有什么问题? If我在阅读资料方面是正确的,问题就解决了。

以上是关于何时为新创建的 ext2 inode 分配存储空间?的主要内容,如果未能解决你的问题,请参考以下文章

Linux_文件系统(inode磁盘结构寻址方案EXT2文件系统创建删除文件过程软硬链接)

liunx ext2

文件系统(ext2)及linux相关文件指令

EXT2:了解 inode 位图

linux inode文件系统;备份恢复及日志分析

ext2/3/4的inode结构说明