mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 04:20:53 +07:00
vfs: restructure d_genocide()
It shouldn't matter when we decrement the refcount during the walk as long as we do it exactly once. Restructure d_genocide() to do the killing on entering the dentry instead of when leaving it. This helps creating a common helper for tree walking. Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
a09e9a7a4b
commit
01ddc4ede5
12
fs/dcache.c
12
fs/dcache.c
@ -2952,6 +2952,10 @@ void d_genocide(struct dentry *root)
|
|||||||
spin_unlock(&dentry->d_lock);
|
spin_unlock(&dentry->d_lock);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!(dentry->d_flags & DCACHE_GENOCIDE)) {
|
||||||
|
dentry->d_flags |= DCACHE_GENOCIDE;
|
||||||
|
dentry->d_lockref.count--;
|
||||||
|
}
|
||||||
if (!list_empty(&dentry->d_subdirs)) {
|
if (!list_empty(&dentry->d_subdirs)) {
|
||||||
spin_unlock(&this_parent->d_lock);
|
spin_unlock(&this_parent->d_lock);
|
||||||
spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_);
|
spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_);
|
||||||
@ -2959,18 +2963,10 @@ void d_genocide(struct dentry *root)
|
|||||||
spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_);
|
spin_acquire(&this_parent->d_lock.dep_map, 0, 1, _RET_IP_);
|
||||||
goto repeat;
|
goto repeat;
|
||||||
}
|
}
|
||||||
if (!(dentry->d_flags & DCACHE_GENOCIDE)) {
|
|
||||||
dentry->d_flags |= DCACHE_GENOCIDE;
|
|
||||||
dentry->d_lockref.count--;
|
|
||||||
}
|
|
||||||
spin_unlock(&dentry->d_lock);
|
spin_unlock(&dentry->d_lock);
|
||||||
}
|
}
|
||||||
if (this_parent != root) {
|
if (this_parent != root) {
|
||||||
struct dentry *child = this_parent;
|
struct dentry *child = this_parent;
|
||||||
if (!(this_parent->d_flags & DCACHE_GENOCIDE)) {
|
|
||||||
this_parent->d_flags |= DCACHE_GENOCIDE;
|
|
||||||
this_parent->d_lockref.count--;
|
|
||||||
}
|
|
||||||
this_parent = try_to_ascend(this_parent, locked, seq);
|
this_parent = try_to_ascend(this_parent, locked, seq);
|
||||||
if (!this_parent)
|
if (!this_parent)
|
||||||
goto rename_retry;
|
goto rename_retry;
|
||||||
|
Loading…
Reference in New Issue
Block a user