2021SC@SDUSC
今天来分析ext4_extents.h 、 xattr.h 、 truncate.h 三个头文件,为以后分析inode.c核心文件打下基础。
以下是ext4_extents.h头文件的代码分析
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2003-2006, Cluster File Systems, Inc, info@clusterfs.com
* Written by Alex Tomas <alex@clusterfs.com>
*/
#ifndef _EXT4_EXTENTS
#define _EXT4_EXTENTS
#include "ext4.h"
/*随着aggressive ve_test的定义,索引/叶块的容量变得非常小,因此索引分裂、深度增长和其他硬变化发生得更频繁。这仅用于调试目的。*/
#define AGGRESSIVE_TEST_
/*定义EXTENTS_STATS后,在截断路径中收集块和区段的数量。它们将在umount时间显示。*/
#define EXTENTS_STATS__
/*如果定义了CHECK_BINSEARCH,那么二进制搜索的结果也将通过线性搜索进行检查。*/
#define CHECK_BINSEARCH__
/*如果定义了EXT_STATS,则统计数据将被收集。这些数字将在umount时显示。*/
#define EXT_STATS_
/** ext4_inode有i_block数组(总共60字节)。
*前12字节存储ext4_extent_header;其余存储ext4_extent数组。对于非inode扩展块,ext4_extent_tail紧跟在数组之后。*/
/**这是磁盘上的extent tail结构。
*所有其他区段结构都是12字节长。结果表明,对于大于512的2的所有幂,block_size % 12 >= 4,这覆盖了所有有效的ext4块大小。因此,这个尾部结构可以被塞到块的末端,而不需要重新平衡树。*/
struct ext4_extent_tail {
__le32 et_checksum; /* crc32c(uuid+inum+extent_block) */
};
/*这是磁盘上的extent结构。
它在树的底部使用。*/
struct ext4_extent {
__le32 ee_block; /* 首先逻辑块范围覆盖*/
__le16 ee_len; /* 范围所覆盖的块数*/
__le16 ee_start_hi; /* 高16位的物理块*/
__le32 ee_start_lo; /* 低32位物理块*/
};
/*这是磁盘索引结构。
除底部外,所有级别都使用。*/
struct ext4_extent_idx {
__le32 ei_block; /* 索引涵盖了来自“block”的逻辑块*/
__le32 ei_leaf_lo; /*指针指向下一层的物理块。叶索引或下一个索引可能在那里*/
__le16 ei_leaf_hi; /*高16位的物理块 */
__u16 ei_unused;
};
/*每个块(叶子和索引),即使是inode存储的也有头。*/
struct ext4_extent_header {
__le16 eh_magic; /* 可能会支持不同的格式*/
__le16 eh_entries; /* 有效条目数量*/
__le16 eh_max; /* 入库容量*/
__le16 eh_depth; /*树有真正的底层块吗? */
__le32 eh_generation; /* 树的各代*/
};
#define EXT4_EXT_MAGIC cpu_to_le16(0xf30a)
#define EXT4_MAX_EXTENT_DEPTH 5
#define EXT4_EXTENT_TAIL_OFFSET(hdr) \
(sizeof(struct ext4_extent_header) + \
(sizeof(struct ext4_extent) * le16_to_cpu((hdr)->eh_max)))
static inline struct ext4_extent_tail *
find_ext4_extent_tail(struct ext4_extent_header *eh)
{
return (struct ext4_extent_tail *)(((void *)eh) +
EXT4_EXTENT_TAIL_OFFSET(eh));
}
/*ext4_ext_path数组中包含路径。
*创建/查找例程使用它来遍历/分割/等。
* Truncate使用它来模拟递归遍历。
*/
struct ext4_ext_path {
ext4_fsblk_t p_block;
__u16 p_depth;
__u16 p_maxdepth;
struct ext4_extent *p_ext;
struct ext4_extent_idx *p_idx;
struct ext4_extent_header *p_hdr;
struct buffer_head *p_bh;
};
/**用于在空间移除期间遍历区段树时,记录在区段开始或结束时发现的簇的一部分。
*如果一个部分集群中没有与未被删除的区段共享的块(处于空闲状态),可能会被移除。否则,它不能被删除(nofree状态)。*/
struct partial_cluster {
ext4_fsblk_t pclu; /* physical cluster number */
ext4_lblk_t lblk; /* logical block number within logical cluster */
enum {initial, tofree, nofree} state;
};
/**结构的外部API*/
/** EXT_INIT_MAX_LEN是在初始化的extent中可以拥有的最大块数。这是2^15而不是(2^16