EXT4文件系统之多块分配

EXT4文件系统之多块分配

如果文件inode支持延迟分配,则可以略过空间查找和磁盘配额的分支,因为他们已经被准备好了。如果空间查找为0,则返回ENOSPC;如果磁盘配额为0,则返回EDQUOT;两者都无法分配空间。

在多块分配的时候用到了radix_tree数据结构,将块结构描述符的块组保存到缓存中,但是这样的数据保存了两份,分别为bd_buddy和bd_bitmap

struct ext4_buddy {

         struct page*bd_buddy_page;

         void *bd_buddy;

         struct page*bd_bitmap_page;

         void *bd_bitmap;

};

应当注意一下,在调用radix操作的时候,inode其实是指向struct inode *inode = sbi->s_buddy_cache,不是文件系统中数据块的inode,是buddy中专用的inode。在初始化的时候,两者的数据是一致的。Bd_bitmap保存的是磁盘上的原始数据,在块分配的时候用的是bd_buddy数据,当分配完成时再更新磁盘上的数据。对于数据块位图0,1,2,3,4等(举例来说)保存在inode->i_mapping( s_buddy_cache->i_mapping)中,处理的时候,这些数据块位图分别计算为0,2,4,6,8索引对应块号,但是读数据的时候,取的时候再除以2,读出来的数据还是0,1,2,3,4的的数据块。然后这些数据块被复制到空余的1,3,5,7,9的索引里,即为bd_buddy数据。

ext4_fsblk_t ext4_mb_new_blocks()

{

先从预分配块中分配数据块,如果成功,则完成;

如果不成功,先对齐一些数据,再调用ext4_mb_regular_allocator(ac)分配数据块;

这个时候分配成功,将剩余的块放入预分配块中,然后在磁盘上标志新的位图;

如果分配失败,则恢复新分配的块和预分配的块中的数据。

}

ext4_mb_regular_allocator(structext4_allocation_context *ac)

{

先在bd_buddy上查找是否有合适的块分配,找到,则完成,也是在buddy上操作;

没完成,再调入新的块组。

}

猜你喜欢

转载自blog.csdn.net/lieye_leaves/article/details/78742231