RK3588 kernel-6.1 ext4 扩展属性(xattr)模块分析
1. 分析范围
| 文件 | 角色 |
|---|---|
xattr.c |
盘上格式、inode 内 / 外部块 / xattr inode 存取、listxattr/get/set、共享块与 mbcache、校验和、日记事务、ext4_xattr_handlers 与 handler_map |
xattr_user.c |
user. 前缀:依赖挂载选项 user_xattr |
xattr_trusted.c |
trusted. 前缀:列表需 CAP_SYS_ADMIN |
xattr_security.c |
security. 前缀:与 LSM 安全标 对接;ext4_init_security 创建 inode 时写入初始 xattr |
xattr_hurd.c |
gnu.(XATTR_HURD_PREFIX)前缀:GNU Hurd 兼容命名空间,与 user 相同依赖 user_xattr |
xattr.h定义 magic、索引号、ext4_xattr_header/entry等 磁盘布局常量。
2. 整体作用(一句话)
ext4 把扩展属性存在 inode 尾部 extra 区(ibody) 和/或 i_file_acl 指向的外部 4K 块(可 多 inode 共享、mbcache 去重**),大值可走 xattr inode(e_value_inum);xattr.c 负责 校验、读写、日记、配额与删除 inode 时拆引用;xattr_*.c 仅实现 VFS xattr_handler,把 带前缀的用户态名 映射到 EXT4_XATTR_INDEX_* 并调用 ext4_xattr_get/ext4_xattr_set,外加 权限/挂载策略 与 安全模块初始化。**
3. xattr.c 解决的核心问题
| 问题 | 处理方式 |
|---|---|
| 空间不足且要兼容 128B 老 inode | ibody:依赖 i_extra_isize;不够则 分配外部属性块 或 xattr inode |
| 同名索引与 VFS 前缀 | e_name_index 映射到 xattr_handler(ext4_xattr_handler_map) |
| get 顺序 | xattr_sem 读锁 下 先 ibody ext4_xattr_ibody_get,-ENODATA 再块 ext4_xattr_block_get |
| list 合并与过滤 | ext4_listxattr:ibody + block;每项经 handler->list(dentry) 决定是否出现在列表里 |
| 损坏与篡改 | ext4_xattr_check_block:magic、h_blocks=1、metadata_csum 时 CRC、ext4_xattr_check_entries(边界、XATTR_SIZE_MAX 上界) |
| 外部块共享 | h_refcount;ext4_xattr_block_cache_*(mbcache)找 内容相同块 以 节省空间 |
| 写路径与崩溃一致性 | ext4_journal_start/ext4_xattr_set_handle;ext4_xattr_set_credits 估算 credits;**xattr 会使 fast commit 对该事务 EXT4_FC_REASON_XATTR 不合格 |
| 删文件泄漏 EA 块 | ext4_xattr_delete_inode(inode.c evict 路径):减 refcount、释放 块/xattr inode |
| 加密目录等 | 与 fscrypt 协同(EXT4_XATTR_INDEX_ENCRYPTION 等在其它路径;本批文件不展开) |
| 锁 | 注释:i_file_acl 由 xattr_sem 保护;独占块 时 xattr_sem + buffer lock |
盘上条目布局(摘自 xattr.c 头注释):头 + 自顶向下增长的 entry + 自底向上对齐存放 value;块内 entry 有序,inode 内无序。
4. 各 xattr_*.c:分工与解决的问题
4.1 xattr_user.c:user.
- 前缀:
XATTR_USER_PREFIX(user.) - 索引:
EXT4_XATTR_INDEX_USER - 策略:
list/get/set均要求test_opt(sb, XATTR_USER),否则-EOPNOTSUPP - 解决的问题:与挂载选项
user_xattr对齐,默认不启用户 EA 时可 拒绝 普通用户的user.*,避免旧策略或不信任场景
4.2 xattr_trusted.c:trusted.
- 前缀:
XATTR_TRUSTED_PREFIX - 索引:
EXT4_XATTR_INDEX_TRUSTED - 策略:
ext4_xattr_trusted_list仅当capable(CAP_SYS_ADMIN)为真才列出;get/set 直接进ext4_xattr_* - 解决的问题:
trusted.*仅管理员可见列表;写入权 仍由 内核通用 xattr 与 capability 约束(与user.分离命名空间)
4.3 xattr_security.c:security.
- 前缀:
XATTR_SECURITY_PREFIX - 索引:
EXT4_XATTR_INDEX_SECURITY(CONFIG_EXT4_FS_SECURITY) - handler:无
list成员(由 LSM/通用层 处理枚举逻辑) ext4_init_security:security_inode_init_security+ 回调ext4_initxattrs→ext4_xattr_set_handleXATTR_CREATE写 多条 security xattr- 解决的问题:新建 inode(如
create/mkdir)时 自动生成 SELinux/SMACK 等标签,与 磁盘security.索引 一致
4.4 xattr_hurd.c:GNU Hurd
- 前缀:
XATTR_HURD_PREFIX - 索引:
EXT4_XATTR_INDEX_HURD(xattr.h注明 reserved for Hurd) - 策略:与
user相同,**list/get/set都受XATTR_USER挂载选项 门控 - 解决的问题:Hurd 工具链使用独立索引,与
user.不混桶,仍共享 「是否允许用户 EA」 的挂载策略
5. 处理器注册关系
ext4_xattr_handlers[](供 super.c 设 sb->s_xattr)包含 user、trusted、ACL(可选)、security(可选)、hurd。
ext4_xattr_handler_map[] 按 name_index 解析盘上 e_name_index,在 list/get 遍历时 绑定 前缀与权限回调。
6. 小结
xattr.c:ext4 扩展属性的「引擎」——格式、一致性、缓存共享、日记与生命周期。- 四个小文件:薄适配层,把 VFS/LSM/挂载策略 接到
EXT4_XATTR_INDEX_*。 - 重复说明:仅需一份
xattr_security.c分析;xattr_user与xattr_hurd共用user_xattr门控,但磁盘索引不同。
若需 POSIX ACL 与 system.posix_acl_*,见 acl.c;加密 xattr 名见 fs/crypto 与 ext4 加密索引 路径。
正在加载留言…