Commit a734eb45 authored by Nick Piggin's avatar Nick Piggin

fs: dcache reduce d_parent locking

Use RCU to simplify locking in dget_parent.
Signed-off-by: default avatarNick Piggin <npiggin@kernel.dk>
parent dc0474be
......@@ -446,24 +446,27 @@ struct dentry *dget_parent(struct dentry *dentry)
struct dentry *ret;
repeat:
spin_lock(&dentry->d_lock);
/*
* Don't need rcu_dereference because we re-check it was correct under
* the lock.
*/
rcu_read_lock();
ret = dentry->d_parent;
if (!ret)
goto out;
if (dentry == ret) {
ret->d_count++;
if (!ret) {
rcu_read_unlock();
goto out;
}
if (!spin_trylock(&ret->d_lock)) {
spin_unlock(&dentry->d_lock);
cpu_relax();
spin_lock(&ret->d_lock);
if (unlikely(ret != dentry->d_parent)) {
spin_unlock(&ret->d_lock);
rcu_read_unlock();
goto repeat;
}
rcu_read_unlock();
BUG_ON(!ret->d_count);
ret->d_count++;
spin_unlock(&ret->d_lock);
out:
spin_unlock(&dentry->d_lock);
return ret;
}
EXPORT_SYMBOL(dget_parent);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment