Linux kernel 何时为新创建的ext2 inode分配存储?

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和将块放入页面缓存。这种

我正在学习如何在ext2fs上创建新的常规文件。
(这本书在多个地方:不确定它们的合法性。只是相关章节的更新版本在-但它没有所有相关数据) 在我看来,Linux内核必须创建一个新的inode,并为其分配必要的块。 报告概述了以下程序:

  • 创建索引节点
    (第758页)
  • 分配数据块
    (第764页)
我不明白的是内核什么时候分配新inode的数据块。

创建inode
过程的末尾(第14段),我看到了以下内容:

调用
ext2\u preread\u inode()
从包含 inode和将块放入页面缓存。这种 执行预读是因为最近创建的inode可能 很快就会回信的

所以,就在这之前——在我看来,这是分配inode块的合理位置。然而,ext2架构师可能决定在不同的时间进行分配

有人知道什么时候为新创建的ext2 inode分配了存储吗?

在书中,我发现:

  • 分配磁盘索引节点:在索引节点位图中设置相应的位,并将包含位图的缓冲区标记为脏。此外 如果文件系统已安装,请指定MS_同步标志 (请参阅第12章中的“安装通用文件系统”一节) 函数调用sync\u dirty\u buffer()来启动I/O写操作 并等待操作终止
  • 这意味着在分配磁盘索引节点方面,只需在内存中设置保留索引节点位图的位,并将该位图缓冲区标记为脏。这意味着很快该位图将被写回存储器

    关于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块时,他们指的是设置了特定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);
    )
    )现在的问题是什么?
    如果
    我读的资料是正确的,那么问题就解决了。