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>
This commit is contained in:
Al Viro 2018-04-15 18:31:03 -04:00
parent 9c5f1d3019
commit 1088a6408c
1 changed files with 13 additions and 18 deletions

View File

@ -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);