now lock_parent() can't run into killed dentry
all remaining callers hold either a reference or ->i_lock Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
3b3f09f48b
commit
65d8eb5a8f
1 changed files with 4 additions and 11 deletions
15
fs/dcache.c
15
fs/dcache.c
|
@ -593,8 +593,6 @@ static inline struct dentry *lock_parent(struct dentry *dentry)
|
|||
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();
|
||||
|
@ -614,16 +612,11 @@ again:
|
|||
spin_unlock(&parent->d_lock);
|
||||
goto again;
|
||||
}
|
||||
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 {
|
||||
parent = NULL;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
if (parent != dentry)
|
||||
spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
else
|
||||
parent = NULL;
|
||||
return parent;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue