aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/dcache.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/fs/dcache.c b/fs/dcache.c
index 42ae01eefc07..6888dde4d568 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -455,12 +455,6 @@ dentry_kill(struct dentry *dentry, int unlock_on_failure)
455 struct dentry *parent = NULL; 455 struct dentry *parent = NULL;
456 bool can_free = true; 456 bool can_free = true;
457 457
458 if (unlikely(dentry->d_flags & DCACHE_DENTRY_KILLED)) {
459 can_free = dentry->d_flags & DCACHE_MAY_FREE;
460 spin_unlock(&dentry->d_lock);
461 goto out;
462 }
463
464 inode = dentry->d_inode; 458 inode = dentry->d_inode;
465 if (inode && !spin_trylock(&inode->i_lock)) { 459 if (inode && !spin_trylock(&inode->i_lock)) {
466relock: 460relock:
@@ -815,6 +809,15 @@ static void shrink_dentry_list(struct list_head *list)
815 continue; 809 continue;
816 } 810 }
817 811
812
813 if (unlikely(dentry->d_flags & DCACHE_DENTRY_KILLED)) {
814 bool can_free = dentry->d_flags & DCACHE_MAY_FREE;
815 spin_unlock(&dentry->d_lock);
816 if (can_free)
817 dentry_free(dentry);
818 continue;
819 }
820
818 parent = dentry_kill(dentry, 0); 821 parent = dentry_kill(dentry, 0);
819 /* 822 /*
820 * If dentry_kill returns NULL, we have nothing more to do. 823 * If dentry_kill returns NULL, we have nothing more to do.