Commit c1d0c1a2 authored by John Ogness's avatar John Ogness Committed by Al Viro

fs/dcache: Move dentry_kill() below lock_parent()

A subsequent patch will modify dentry_kill() to call lock_parent().
Move the dentry_kill() implementation "as is" below lock_parent()
first. This will help simplify the review of the subsequent patch
with dentry_kill() changes.
Signed-off-by: default avatarJohn Ogness <john.ogness@linutronix.de>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 06080d10
...@@ -588,37 +588,6 @@ static void __dentry_kill(struct dentry *dentry) ...@@ -588,37 +588,6 @@ static void __dentry_kill(struct dentry *dentry)
dentry_free(dentry); dentry_free(dentry);
} }
/*
* Finish off a dentry we've decided to kill.
* dentry->d_lock must be held, returns with it unlocked.
* Returns dentry requiring refcount drop, or NULL if we're done.
*/
static struct dentry *dentry_kill(struct dentry *dentry)
__releases(dentry->d_lock)
{
struct inode *inode = dentry->d_inode;
struct dentry *parent = NULL;
if (inode && unlikely(!spin_trylock(&inode->i_lock)))
goto failed;
if (!IS_ROOT(dentry)) {
parent = dentry->d_parent;
if (unlikely(!spin_trylock(&parent->d_lock))) {
if (inode)
spin_unlock(&inode->i_lock);
goto failed;
}
}
__dentry_kill(dentry);
return parent;
failed:
spin_unlock(&dentry->d_lock);
return dentry; /* try again with same dentry */
}
static inline struct dentry *lock_parent(struct dentry *dentry) static inline struct dentry *lock_parent(struct dentry *dentry)
{ {
struct dentry *parent = dentry->d_parent; struct dentry *parent = dentry->d_parent;
...@@ -658,6 +627,37 @@ static inline struct dentry *lock_parent(struct dentry *dentry) ...@@ -658,6 +627,37 @@ static inline struct dentry *lock_parent(struct dentry *dentry)
return parent; return parent;
} }
/*
* Finish off a dentry we've decided to kill.
* dentry->d_lock must be held, returns with it unlocked.
* Returns dentry requiring refcount drop, or NULL if we're done.
*/
static struct dentry *dentry_kill(struct dentry *dentry)
__releases(dentry->d_lock)
{
struct inode *inode = dentry->d_inode;
struct dentry *parent = NULL;
if (inode && unlikely(!spin_trylock(&inode->i_lock)))
goto failed;
if (!IS_ROOT(dentry)) {
parent = dentry->d_parent;
if (unlikely(!spin_trylock(&parent->d_lock))) {
if (inode)
spin_unlock(&inode->i_lock);
goto failed;
}
}
__dentry_kill(dentry);
return parent;
failed:
spin_unlock(&dentry->d_lock);
return dentry; /* try again with same dentry */
}
/* /*
* Try to do a lockless dput(), and return whether that was successful. * Try to do a lockless dput(), and return whether that was successful.
* *
......
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