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