Linux内核文件系统7

这篇博客主要探讨了Linux内核中ext4文件系统的ext4_extents.h、xattr.h和truncate.h三个关键头文件的内容。通过对这些文件的代码分析,为读者深入理解inode.c的核心功能奠定了基础,特别是涉及到文件的扩展、扩展属性以及文件截断等核心概念。
摘要由CSDN通过智能技术生成

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>