分类: LINUX
2010-09-27 17:12:54
|
预留块的信息是有一棵红黑树管理的,如图1:
struct rb_node
{
unsigned long rb_parent_color;
struct rb_node *rb_right;
struct rb_node *rb_left;
};
这个结构表示树中的一个节点。
struct rb_root
{
struct rb_node *rb_node;
};
这个结构只是个封装,用来指向一颗树的根节点。
注意上面节点中并没有数据,那么数据存放在哪里?
struct ext2_reserve_window {
ext2_fsblk_t _rsv_start; /* First byte reserved */
ext2_fsblk_t _rsv_end; /* Last byte reserved or 0 */
};
这个结构用于表示一个块预留区间,[_rsv_start,_rsv_end]。
struct ext2_reserve_window_node {
struct rb_node rsv_node;
__u32 rsv_goal_size;
__u32 rsv_alloc_hit;
struct ext2_reserve_window rsv_window;
};
这个结构既包含一个struct rb_node,又包含一个struct ext2_reserve_window,将两者结合起来了。
struct ext2_block_alloc_info {
struct ext2_reserve_window_node rsv_window_node;
__u32 last_alloc_logical_block;
ext2_fsblk_t last_alloc_physical_block;
};
这个结构描述了一个inode的预留窗口,以及上一次分配的逻辑磁盘块号和物理磁盘块号。
/*
* second extended file system inode data in memory
*/
struct ext2_inode_info {
……
/* block reservation info */
struct ext2_block_alloc_info *i_block_alloc_info;
};
这个结构是根据磁盘上的inode信息建立起来的,每个文件一个。
/*
* second extended-fs super-block data in memory
*/
struct ext2_sb_info {
/* root of the per fs reservation window tree */
spinlock_t s_rsv_window_lock;
struct rb_root s_rsv_window_root;
struct ext2_reserve_window_node s_rsv_window_head;
};
这个结构是根据磁盘中的超级块在内存中建立起来的,每个文件系统一个。其中s_rsv_window_root就是红黑树的根节点,s_rsv_window_head就是包含红黑树的根节点的struct ext2_reserve_window_node。
一个文件系统对应一个ext2_sb_info结构,一个ext2_sb_info结构指向一棵红黑树。
每个文件inode对应一个ext2_inode_info结构,每个ext2_inode_info结构指向一个ext2_block_alloc_info结构。
每个ext2_block_alloc_info结构包含一个ext2_reserve_window结构。
每个ext2_reserve_window结构包含一个rb_node结构和一个ext2_reserve_window结构。
rb_node结构用于组成一个树状结构。
每个ext2_reserve_window结构描述一个区间,并且多个ext2_reserve_window结构之间不会重叠。
(这个图费了好久才画出来,但是这里不知道怎么放大,可以参考附件)