diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2018-02-24 05:07:24 +0300 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2018-03-29 22:07:43 +0300 |
commit | a338579f2f3d6a15c78f1dc7de4c248b4183fcea (patch) | |
tree | b0ae110ff3b808fc4d3b251fba29e0eec6b43d93 /fs/dcache.c | |
parent | 8b987a46a1e0e93d4cb4babea06ea274e2e2b658 (diff) |
dput(): consolidate the "do we need to retain it?" into an inlined helper
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/dcache.c')
-rw-r--r-- | fs/dcache.c | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index 61819fb32e13..4208376497f4 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -626,6 +626,24 @@ static inline struct dentry *lock_parent(struct dentry *dentry) return __lock_parent(dentry); } +static inline bool retain_dentry(struct dentry *dentry) +{ + WARN_ON(d_in_lookup(dentry)); + + /* Unreachable? Get rid of it */ + if (unlikely(d_unhashed(dentry))) + return false; + + if (unlikely(dentry->d_flags & DCACHE_DISCONNECTED)) + return false; + + if (unlikely(dentry->d_flags & DCACHE_OP_DELETE)) { + if (dentry->d_op->d_delete(dentry)) + return false; + } + return true; +} + /* * Finish off a dentry we've decided to kill. * dentry->d_lock must be held, returns with it unlocked. @@ -804,27 +822,13 @@ repeat: /* Slow case: now with the dentry lock held */ rcu_read_unlock(); - WARN_ON(d_in_lookup(dentry)); - - /* Unreachable? Get rid of it */ - if (unlikely(d_unhashed(dentry))) - goto kill_it; - - if (unlikely(dentry->d_flags & DCACHE_DISCONNECTED)) - goto kill_it; - - if (unlikely(dentry->d_flags & DCACHE_OP_DELETE)) { - if (dentry->d_op->d_delete(dentry)) - goto kill_it; + if (likely(retain_dentry(dentry))) { + dentry_lru_add(dentry); + dentry->d_lockref.count--; + spin_unlock(&dentry->d_lock); + return; } - dentry_lru_add(dentry); - - dentry->d_lockref.count--; - spin_unlock(&dentry->d_lock); - return; - -kill_it: dentry = dentry_kill(dentry); if (dentry) { cond_resched(); |