From: Al Viro Date: Sun, 15 Apr 2018 22:31:03 +0000 (-0400) Subject: dput(): turn into explicit while() loop X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=1088a6408ce197bef7ba04b32e6b034e95d6d2c1;p=linux.git 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 --- diff --git a/fs/dcache.c b/fs/dcache.c index fd4c6de17b947..c4d2234eccc36 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);