forked from Minki/linux
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: John Ogness <john.ogness@linutronix.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
06080d100d
commit
c1d0c1a2b5
62
fs/dcache.c
62
fs/dcache.c
@ -588,37 +588,6 @@ static void __dentry_kill(struct dentry *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)
|
||||
{
|
||||
struct dentry *parent = dentry->d_parent;
|
||||
@ -658,6 +627,37 @@ again:
|
||||
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.
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user