diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2018-04-16 00:31:03 +0200 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2018-04-16 05:36:58 +0200 |
commit | 1088a6408ce197bef7ba04b32e6b034e95d6d2c1 (patch) | |
tree | 9835d8983dd4a14506963de7748b7029b2f2bb05 /fs/dcache.c | |
parent | dcache: move cond_resched() into the end of __dentry_kill() (diff) | |
download | linux-1088a6408ce197bef7ba04b32e6b034e95d6d2c1.tar.xz linux-1088a6408ce197bef7ba04b32e6b034e95d6d2c1.zip |
dput(): turn into explicit while() loop
No need to mess with gotos when the code yielded by straight while()
isn't any worse...
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/dcache.c')
-rw-r--r-- | fs/dcache.c | 31 |
1 files changed, 13 insertions, 18 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index fd4c6de17b94..c4d2234eccc3 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -828,29 +828,24 @@ static inline bool fast_dput(struct dentry *dentry) */ void dput(struct dentry *dentry) { - if (unlikely(!dentry)) - return; + while (dentry) { + might_sleep(); -repeat: - might_sleep(); + rcu_read_lock(); + if (likely(fast_dput(dentry))) { + rcu_read_unlock(); + return; + } - rcu_read_lock(); - if (likely(fast_dput(dentry))) { + /* Slow case: now with the dentry lock held */ rcu_read_unlock(); - return; - } - /* Slow case: now with the dentry lock held */ - rcu_read_unlock(); - - if (likely(retain_dentry(dentry))) { - spin_unlock(&dentry->d_lock); - return; - } + if (likely(retain_dentry(dentry))) { + spin_unlock(&dentry->d_lock); + return; + } - dentry = dentry_kill(dentry); - if (dentry) { - goto repeat; + dentry = dentry_kill(dentry); } } EXPORT_SYMBOL(dput); |