内核文件系统API之d_delete

void d_delete(struct dentry * dentry) 用于删除一个dentry
其源码分析如下:

void d_delete(struct dentry * dentry)
{
	struct inode *inode;
	int isdir = 0;
	/*
	 * Are we the only user?
	 */
again:
	spin_lock(&dentry->d_lock);
	inode = dentry->d_inode;
	#检查这个dentry是否是一个目录的dentry
	isdir = S_ISDIR(inode->i_mode);
	#如果目前dentry 只有一个user 使用的话,则尝试获取锁,如果获取失败的话,则采用goto 循环继续尝试获取
	if (dentry->d_lockref.count == 1) {
		if (!spin_trylock(&inode->i_lock)) {
			spin_unlock(&dentry->d_lock);
			cpu_relax();
			goto again;
		}
		#获取锁后,清除DCACHE_CANT_MOUNT 标志
		dentry->d_flags &= ~DCACHE_CANT_MOUNT;
		dentry_unlink_inode(dentry);
		#通知这个会删除dentry 表示的目录
		fsnotify_nameremove(dentry, isdir);
		return;
	}
	#如果dentry 使用的user超过一个的话,则尝试drop操作
	if (!d_unhashed(dentry))
		__d_drop(dentry);

	spin_unlock(&dentry->d_lock);
	#通知这个会删除dentry 表示的目录
	fsnotify_nameremove(dentry, isdir);
}
其中的fsnotify_nameremove的实现如下:
static inline void fsnotify_nameremove(struct dentry *dentry, int isdir)
{
	__u32 mask = FS_DELETE;
	#如果要删除的dentry是个目录的话,要加上FS_ISDIR
	if (isdir)
		mask |= FS_ISDIR;
	#通知这个dentry的父dentry要发生的事件
	fsnotify_parent(NULL, dentry, mask);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值