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

时间:2014-10-15 17:02:51

标签: linux-kernel filesystems inode ext3 ext2

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

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

book概述了以下程序:

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

当内核分配新的inode的数据块时,我不明白是

接近Creating inodes程序的结尾(第14段),我看到以下内容:

  

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

所以,就在此之前 - 在我看来是一个合理的地方来分配inode的块。但是,可能是ext2架构师决定在不同的时间进行分配。

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

2 个答案:

答案 0 :(得分:0)

在书中我发现了这个:

  
      
  1. 分配磁盘inode:设置inode位图中的相应位,并将包含位图的缓冲区标记为脏。此外,   如果已挂载文件系统,则指定MS_SYNCHRONOUS标志   (请参阅第12章中的“安装通用文件系统”一节)   function调用sync_dirty_buffer()来启动I / O写操作   并等待操作终止。
  2.   

这意味着就书籍而言,分配磁盘inode意味着只需在内存保留的inode位图中设置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 }

我不是内核主人,但似乎这个函数只是预读了一些inode位图的块,它保存了当前的inode索引。这是在评论中提到的性能提升方面完成的。

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

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

  

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

所以答案就是ext2_create - &gt; ... - &gt; ext2_alloc_ block

答案 1 :(得分:0)

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