[文件系统] 一个简单文件系统的实现(2)
因为GTFS只是用来学习而不是用于生产环境的,所以GTFS的设计很简单也很简陋。GTFS的主要数据结构和其他文件系统相似,主要的区别是组织块的方式
下面是GTFS的主要数据结构
gt_inode(索引节点,在gt_fs.h中定义)
struct gt_inode {
__le16 i_mode;
__le16 i_uid;
__le16 i_gid;
__le32 i_size;
__le32 i_atime;
__le32 i_ctime;
__le32 i_mtime;
__le32 i_dtime;
__le16 i_nlinks;
__le32 i_flags;
__le32 i_start_block;//索引节点开始块
__le32 i_end_block;//素引节点结束块
__le32 i_blocks;//索引节点占用的块数,另外作为索引节点是否是后一个的flag
__le16 i_dev;
__le32 i_reserved;//为该索引节点预留的块数
__u8 i_nouse[10];
}
很简单是吧,i_blocks的用途有点特别,GTFS默认每个索引节点都会占用一个块,所以新建一个索引节点时,i_start_block=i_end_block,但此时i_blocks和i_reserved为0,因为GTFS对磁盘的使用是顺序使用的,所以当新建一个索引节点时,上一个索引节点就需要设置下预留块数,以便文件的增长。新建的索引节点的开始块等于结束块,但并不需要设置预留块数,因为它可以一直使用到后一个磁盘块(它没有下一个索引节点,我管这叫没有封顶),那么当操作系统打开一个文件时,如何判断这个文件对应的索引节点是不是新建的呢,这就是i_blocks的作用,当i_blocks为0时,说明这个索引节点是新建的。当新建一个索引节点时,会设置上一个索引节点的i_blocks,
i_blocks=i_end_blocks-i_start_blocks+1
所以,每个索引节点都至少占用一个块
gt_inode_info(内存中的i节点信息,在gt.h中定义)
struct gt_inode_info{
__le32 i_start_block;
__le32 i_end_block;
__le32 i_blocks;
__le32 i_reserved;
__u32 i_flags;
__u32 i_dtime;
struct mutex truncate_mutex;
struct inode vfs_inode;
};
gt_super_block(超级块,在gt_fs.h中定义)
struct gt_super_block {
__le32 s_inodes_count;
__le16 s_inode_size;
__le32 s_blocks_count;
__le32 s_free_blocks_count;
__le32 s_free_inodes_count;
__le32 s_first_data_block;
__le32 s_first_ino;
__le32 s_link_max;
__le32 s_log_block_size;
__le32 s_mtime;
__le32 s_wtime;
__le16 s_magic;
};
超级块数据结构没什么特别的,超级块的内容在挂载文件系统时从磁盘超级块读入
gt_sb_info(内存中的超级块,在gt_fs.h中定义)
struct gt_sb_info{
struct gt_super_block * s_gs;//指向GT文件系统的超级块
struct buffer_head * s_sbh;//指向超级块所在的缓冲区
};
gt_dir_entry(目录项,在gt_fs.h中定义)
#define GT_NAME_LEN 60 //目录项名字长度
struct gt_dir_entry {
__le32 ino;
char name[GT_NAME_LEN];
};
文章来源CU社区:[文件系统] 一个简单文件系统的实现
相关文章