内核文件系统API之vfs_getattr

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;
}

你可能感兴趣的:(Linux,源码分析,kernel常用API源码分析)