内核文件系统API之notify_change

本文深入解析了Linux内核中notify_change()函数的工作原理,该函数用于检查文件系统属性更改的有效性,并通知文件系统进行相应的更新。文章详细分析了源码,包括权限验证、属性更改有效性检查及最终的文件系统通知过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

int notify_change(struct dentry * dentry, struct iattr * attr, struct inode **delegated_inode)
用于检查文件系统attribute的改动是否有效,有效的话,就通知文件系统这个改动,无效的话就返回error
其源码分析如下:
int notify_change(struct dentry * dentry, struct iattr * attr, struct inode **delegated_inode)
{
	struct inode *inode = dentry->d_inode;
	umode_t mode = inode->i_mode;
	int error;
	struct timespec now;
	unsigned int ia_valid = attr->ia_valid;

	WARN_ON_ONCE(!inode_is_locked(inode));
	#首先检查是否允许attr的对ATTR_MODE/ATTR_UID/ATTR_GID/ATTR_TIMES_SET的改动
	if (ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID | ATTR_TIMES_SET)) {
		if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
			return -EPERM;
	}

	/*
	 * If utimes(2) and friends are called with times == NULL (or both
	 * times are UTIME_NOW), then we need to check for write permission
	 */
	 #有效改动是否包含ATTR_TOUCH
	if (ia_valid & ATTR_TOUCH) {
		if (IS_IMMUTABLE(inode))
			return -EPERM;

		if (!inode_owner_or_capable(inode)) {
			error = inode_permission(inode, MAY_WRITE);
			if (error)
				return error;
		}
	}

	/*
	 * Verify that uid/gid changes are valid in the target
	 * namespace of the superblock.
	 */
	 #检查对gid/uid的改动
	if (ia_valid & ATTR_UID &&
	    !kuid_has_mapping(inode->i_sb->s_user_ns, attr->ia_uid))
		return -EOVERFLOW;
	if (ia_valid & ATTR_GID &&
	    !kgid_has_mapping(inode->i_sb->s_user_ns, attr->ia_gid))
		return -EOVERFLOW;

	#是否可以将改动更新到attr中
	if (inode->i_op->setattr)
		error = inode->i_op->setattr(dentry, attr);
	else
		error = simple_setattr(dentry, attr);
	#如果可以更新到文件系统attr中,则这里主要通过fsnotify_change告诉文件系统这个dentry已经改动了
	if (!error) {
		fsnotify_change(dentry, ia_valid);
		ima_inode_post_setattr(dentry);
		evm_inode_post_setattr(dentry, ia_valid);
	}
	#正常情况下error 应该等于零
	return error;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值