RK3588 kernel-6.1 ext4 扩展属性(xattr)模块分析

RK3588 kernel-6.1 ext4 扩展属性(xattr)模块分析

1. 分析范围

文件 角色
xattr.c 盘上格式inode 内 / 外部块 / xattr inode 存取、listxattr/get/set共享块与 mbcache、校验和、日记事务ext4_xattr_handlershandler_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_inumxattr.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_handlerext4_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_blockmagic、h_blocks=1、metadata_csum 时 CRCext4_xattr_check_entries(边界、XATTR_SIZE_MAX 上界
外部块共享 h_refcountext4_xattr_block_cache_*mbcache)找 内容相同块节省空间
写路径与崩溃一致性 ext4_journal_start/ext4_xattr_set_handleext4_xattr_set_credits 估算 credits;**xattr 会使 fast commit 对该事务 EXT4_FC_REASON_XATTR 不合格
删文件泄漏 EA 块 ext4_xattr_delete_inodeinode.c evict 路径):减 refcount、释放 块/xattr inode
加密目录等 fscrypt 协同(EXT4_XATTR_INDEX_ENCRYPTION 等在其它路径;本批文件不展开)
注释:i_file_aclxattr_sem 保护独占块xattr_sem + buffer lock

盘上条目布局(摘自 xattr.c 头注释):头 + 自顶向下增长的 entry + 自底向上对齐存放 value块内 entry 有序,inode 内无序


4. 各 xattr_*.c:分工与解决的问题

4.1 xattr_user.cuser.

  • 前缀XATTR_USER_PREFIXuser.
  • 索引EXT4_XATTR_INDEX_USER
  • 策略list/get/set 均要求 test_opt(sb, XATTR_USER),否则 -EOPNOTSUPP
  • 解决的问题:与挂载选项 user_xattr 对齐,默认不启用户 EA 时可 拒绝 普通用户的 user.*,避免旧策略或不信任场景

4.2 xattr_trusted.ctrusted.

  • 前缀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.csecurity.

  • 前缀XATTR_SECURITY_PREFIX
  • 索引EXT4_XATTR_INDEX_SECURITYCONFIG_EXT4_FS_SECURITY
  • handlerlist 成员(由 LSM/通用层 处理枚举逻辑)
  • ext4_init_securitysecurity_inode_init_security + 回调 ext4_initxattrsext4_xattr_set_handle XATTR_CREATE多条 security xattr
  • 解决的问题新建 inode(如 create/mkdir)时 自动生成 SELinux/SMACK 等标签,与 磁盘 security. 索引 一致

4.4 xattr_hurd.c:GNU Hurd

  • 前缀XATTR_HURD_PREFIX
  • 索引EXT4_XATTR_INDEX_HURDxattr.h 注明 reserved for Hurd
  • 策略:与 user 相同,**list/get/set 都受 XATTR_USER 挂载选项 门控
  • 解决的问题Hurd 工具链使用独立索引,与 user. 不混桶,仍共享 「是否允许用户 EA」 的挂载策略

5. 处理器注册关系

ext4_xattr_handlers[](供 super.csb->s_xattr)包含 user、trusted、ACL(可选)、security(可选)、hurd

ext4_xattr_handler_map[]name_index 解析盘上 e_name_index,在 list/get 遍历时 绑定 前缀与权限回调


6. 小结

  • xattr.cext4 扩展属性的「引擎」——格式、一致性、缓存共享、日记与生命周期。
  • 四个小文件薄适配层,把 VFS/LSM/挂载策略 接到 EXT4_XATTR_INDEX_*
  • 重复说明:仅需一份 xattr_security.c 分析;xattr_userxattr_hurd 共用 user_xattr 门控,但磁盘索引不同

若需 POSIX ACL 与 system.posix_acl_*,见 acl.c加密 xattr 名fs/crypto 与 ext4 加密索引 路径。

文章互动

阅读 --

留言

0 条留言

正在加载留言…