Commit 65d8eb5a authored by Al Viro's avatar Al Viro

now lock_parent() can't run into killed dentry

all remaining callers hold either a reference or ->i_lock
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 3b3f09f4
...@@ -593,8 +593,6 @@ static inline struct dentry *lock_parent(struct dentry *dentry) ...@@ -593,8 +593,6 @@ static inline struct dentry *lock_parent(struct dentry *dentry)
struct dentry *parent = dentry->d_parent; struct dentry *parent = dentry->d_parent;
if (IS_ROOT(dentry)) if (IS_ROOT(dentry))
return NULL; return NULL;
if (unlikely(dentry->d_lockref.count < 0))
return NULL;
if (likely(spin_trylock(&parent->d_lock))) if (likely(spin_trylock(&parent->d_lock)))
return parent; return parent;
rcu_read_lock(); rcu_read_lock();
...@@ -614,16 +612,11 @@ static inline struct dentry *lock_parent(struct dentry *dentry) ...@@ -614,16 +612,11 @@ static inline struct dentry *lock_parent(struct dentry *dentry)
spin_unlock(&parent->d_lock); spin_unlock(&parent->d_lock);
goto again; goto again;
} }
if (parent != dentry) { rcu_read_unlock();
if (parent != dentry)
spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED); spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
if (unlikely(dentry->d_lockref.count < 0)) { else
spin_unlock(&parent->d_lock);
parent = NULL;
}
} else {
parent = NULL; parent = NULL;
}
rcu_read_unlock();
return parent; return 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