aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2014-05-28 09:48:44 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2014-05-28 09:48:44 -0400
commit64fd72e0a44bdd62c5ca277cb24d0d02b2d8e9dc (patch)
tree03260dee00fe5e06cd627cd04990e806992057a9 /fs
parentb6dd6f4738837439c520e73995ec93fe1de2ec72 (diff)
lift the "already marked killed" case into shrink_dentry_list()
It can happen only when dentry_kill() is called with unlock_on_failure equal to 0 - other callers had dentry pinned until the moment they've got ->d_lock and DCACHE_DENTRY_KILLED is set only after lockref_mark_dead(). IOW, only one of three call sites of dentry_kill() might end up reaching that code. Just move it there. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
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.