int vfs_getattr(const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags)用于得到文件的 enhanced basic attributes 即基本的扩展属性
其源码分析如下:
int vfs_getattr(const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags)
{
int retval;
#对path 表示的文件进行安全检查,例如selinux
retval = security_inode_getattr(path);
if (retval)
return retval;
#前面已经检查过安全了,因此这里通过非安全的方法获得文件的基本扩展属性
return vfs_getattr_nosec(path, stat, request_mask, query_flags);
}
int vfs_getattr_nosec(const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int query_flags)
{
#得到path 表示文件的inode
struct inode *inode = d_backing_inode(path->dentry);
#清零stat,因为stat 会保存扩展属实返回给用户
memset(stat, 0, sizeof(*stat));
stat->result_mask |= STATX_BASIC_STATS;
request_mask &= STATX_ALL;
query_flags &= KSTAT_QUERY_FLAGS;
#看起来文件的扩展属性可以保存到inode上,则通过inode 提供的函数返回给用户
if (inode->i_op->getattr)
return inode->i_op->getattr(path, stat, request_mask,
query_flags);
#如果inode上没有保存,则调用文件系统提供的通用函数获得文件的扩展属性
generic_fillattr(inode, stat);
return 0;
}
内核文件系统API之vfs_getattr
最新推荐文章于 2023-03-21 17:48:28 发布