1. statx() 的 STATX_ATTR(FS_NODUMP_FL、FS_IMMUTABLE_FL 等)flags 字段?
statx() 返回的 stx_attributes 字段中有哪些标志位(如 STATX_ATTR_NODUMP、STATX_ATTR_IMMUTABLE 等),它们反映了文件系统的哪些属性,与传统的 stat() 相比有何价值?
- statx 的 stx_attributes 字段与 linux 文件属性的对应关系
- STATX_ATTR_* 标志位如何映射到底层 fs 的 inode flags(如 FS_NODUMP_FL、FS_IMMUTABLE_FL)
- stx_attributes_mask 与 stx_attributes 的配合使用
statx() 的 stx_attributes 字段返回一组与文件元数据相关的属性标志,其中最重要的有 STATX_ATTR_IMMUTABLE(文件不可修改,对应 chattr +i / FS_IMMUTABLE_FL)、STATX_ATTR_APPEND(只允许追加,对应 +a / FS_APPEND_FL)、STATX_ATTR_NODUMP(禁止 dump 备份,对应 +d / FS_NODUMP_FL),以及 STATX_ATTR_COMPRESSED、STATX_ATTR_ENCRYPTED、STATX_ATTR_VERITY(fs-verity 完整性校验)等。调用方必须配合 stx_attributes_mask 使用:只有 mask 中"1"的位才是由内核真实填充的,其余位无意义。与 stat() 相比,statx 把这些"属性"从传统的 ioctl (FS_IOC_GETFLAGS) 中统一进了同一次系统调用,减少了一次额外的 ioctl 往返,也让用户态无需了解具体文件系统即可读取通用属性。
这些标志位本质上是文件系统 inode 持久化标志的"跨文件系统通配层"。内核在 statx 中把底层具体 fs 的 i_flags 翻译成这些通用位,从而让 ls、cp、备份工具等通用软件无需依赖具体 fs 的 ioctl 就能感知诸如不可变、只追加、加密等属性。要求校验 stx_attributes_mask 是为了向后兼容:老内核或某些 fs 不支持的属性位会被清零,迁移代码不校验 mask 会误判。