all remaining callers hold either a reference or ->i_lock
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
struct dentry *parent = dentry->d_parent;
if (IS_ROOT(dentry))
return NULL;
- if (unlikely(dentry->d_lockref.count < 0))
- return NULL;
if (likely(spin_trylock(&parent->d_lock)))
return parent;
rcu_read_lock();
spin_unlock(&parent->d_lock);
goto again;
}
- if (parent != dentry) {
+ rcu_read_unlock();
+ if (parent != dentry)
spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
- if (unlikely(dentry->d_lockref.count < 0)) {
- spin_unlock(&parent->d_lock);
- parent = NULL;
- }
- } else {
+ else
parent = NULL;
- }
- rcu_read_unlock();
return parent;
}