diff --git a/fs/dcache.c b/fs/dcache.c index 5aa53bc056bada2af9c3c6040498abcb9a3a3856..f792e9f20eca112eefebdd672c87fdf1001df6c3 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -2952,6 +2952,10 @@ void d_genocide(struct dentry *root) spin_unlock(&dentry->d_lock); continue; } + if (!(dentry->d_flags & DCACHE_GENOCIDE)) { + dentry->d_flags |= DCACHE_GENOCIDE; + dentry->d_lockref.count--; + } if (!list_empty(&dentry->d_subdirs)) { spin_unlock(&this_parent->d_lock); 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_); goto repeat; } - if (!(dentry->d_flags & DCACHE_GENOCIDE)) { - dentry->d_flags |= DCACHE_GENOCIDE; - dentry->d_lockref.count--; - } spin_unlock(&dentry->d_lock); } if (this_parent != root) { 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); if (!this_parent) goto rename_retry;