fast_dput(): new rules for refcount
By now there is only one place in entire fast_dput() where we return false; that happens after refcount had been decremented and found (under ->d_lock) to be zero. In that case, just prior to returning false to caller, fast_dput() forcibly changes the refcount from 0 to 1. Lift that resetting refcount to 1 into the callers; later in the series it will be massaged out of existence. Reviewed-by: Christian Brauner <brauner@kernel.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
504e08cebe
commit
15f23734a1
|
@ -847,13 +847,6 @@ locked:
|
|||
spin_unlock(&dentry->d_lock);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Re-get the reference we optimistically dropped. We hold the
|
||||
* lock, and we just tested that it was zero, so we can just
|
||||
* set it to 1.
|
||||
*/
|
||||
dentry->d_lockref.count = 1;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -896,6 +889,7 @@ void dput(struct dentry *dentry)
|
|||
}
|
||||
|
||||
/* Slow case: now with the dentry lock held */
|
||||
dentry->d_lockref.count = 1;
|
||||
rcu_read_unlock();
|
||||
|
||||
if (likely(retain_dentry(dentry))) {
|
||||
|
@ -930,6 +924,7 @@ void dput_to_list(struct dentry *dentry, struct list_head *list)
|
|||
return;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
dentry->d_lockref.count = 1;
|
||||
if (!retain_dentry(dentry))
|
||||
__dput_to_list(dentry, list);
|
||||
spin_unlock(&dentry->d_lock);
|
||||
|
|
Loading…
Reference in New Issue