《Btrfs关键代码解析》由会员分享,可在线阅读,更多相关《Btrfs关键代码解析(5页珍藏版)》请在金锄头文库上搜索。
1、第四章Btrfs关键代码解析extent treeTree of root treeextent treepomterdev tree pointerFSTreepo fsjnfo =fs_info(struct btrfs_fsjnfo),也就是 btrfs_fs_info 结构,其定义为:fs/btrfs/ctree.h802 struct btrfs_fs_info 803u8fsidBTRFS_FSID_SIZE;804u8 chunk_tree_uuidBTRFS_UUID_SIZE;805struct btrfS-root * extent root;806struct btrfS
2、-root *tree root;807struct btrfS-root *chunk root;一 ,808struct btrfsroot *dev_root;809struct btrfS-root *fs root;810struct btrfs_root *csum root;Super Blockroottrwporterchunk tre portter图 Tree of root tree超级块记荣着一个分区的整体信息,Btrfs磁盘super_block结构用 btrfs_super_block 来描述。/磁盘中的super block u8 csumBTRFS_CSUM_
3、SIZE;/* the first 4 fields must match struct btrfs_header */u8 fsidBTRFS_FSID_SIZE; /* FS specific uuid */ _Ie64 bytenr; /* this block number */_Ie64 flags;/* allowed to be different from the btrfs_header from here own down */_Ie64 magic;_Ie64 generation;_Ie64 root;#root树的根节点位置_Ie64 chunk_root; #chu
4、nk 树的根节点位置_Ie64 log_root; #log数的根节点位置FS Tree管理文件相关的元数据,如inode, dir等;Chunk tree管理设备, 每一个磁盘设备都在Chunk Tree中有一个item; Extent Tree管理磁盘空间分配, btrfs每分配一段磁盘空间,便将该磁盘空间的信息插入到Extent tree。奔询Extent Tree将得到空闲的磁盘空间信息;checksum Tree保存数掘块的校验和;Tree of tree root保存很多BTree的根节点。比如用户每建立一个快照,btrfs便会创建 一个 FS Tree。4.2 Btrfs基本结构
5、btrfs使用b+树数据结构,树的内部节点和页节点使用3种数据类 型:btrfs_header, btrfs_disk_key, btrfsjtem.每个节点都是一个 extent,内部节点 和页节点大小可以不一样.每个节点都以btrfs_header开头,内部节点就是 key,value数组,key是btrfs_disk_key, value就是指针,逻辑磁盘位置.页节点同样括相通的key,value,不过位置是key 块,value 块.而且key是btrfsjtem。ul csumulfsidlt4ul chunk trwt uud_lts_magic = BTRFS_SUPER_MAG
6、IC;2. 填充 superblock 的操作函数,比如:sb-s_op = &btrf s_super_ops;3. 用函数opervctree创建树形结构,然后把树根填入超级块的文件系统私有信 息中,如下:tree_root = open_ctree(sb, f s_devices, (char *)data);sb-s fs inf o = tree root;4. 用 btrf s_iget 拿到 inode, d_alloc_root 拿到 dentry 作为5. 构造出根目录数据结构,并填入超级块。inode = btrf s_iget(sb, &key, tree_root-f
7、snf o-f s_root, NULL);root_dentry = d_alloc_root(inode);sb-s_root = root_dentry;open_ctree是其中最复杂的函数,利用磁盘上超级块中存储的信息和我们前 面介绍的数据结构,建立了一整套btrfs使用的树形数据结构填充在超级块中, 如图:图btrfs文件创建过程到此为止,我们构建了一个btrfs的超级块,其中包含:1. btrf s所要使用的一整套树形结构。2. btrf s超级块中的操作函数。3. 创建了一个根目录。这样操作系统内核想要使用和控制btrfs,通过btrfs的超级块就可以了。通 过这个函数的运行流程,可以看出Btrfs文件系统创建文件的一个流程