diff options
author | John Ogness <john.ogness@linutronix.de> | 2018-02-23 02:50:21 +0300 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2018-03-12 18:59:13 +0300 |
commit | c1d0c1a2b51e86124b7ba8ff9054698e2036d8e7 (patch) | |
tree | 72e83696cc87bedb6c65a0315fd3c1c62ebd29e8 /fs/dcache.c | |
parent | 06080d100d921848b35196850ec17310469e06ba (diff) | |
download | linux-c1d0c1a2b51e86124b7ba8ff9054698e2036d8e7.tar.xz |
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>
Diffstat (limited to 'fs/dcache.c')
-rw-r--r-- | fs/dcache.c | 62 |
1 files changed, 31 insertions, 31 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index 9a83fc5f440c..01c0432ec83a 100644 --- a/fs/dcache.c +++ b/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; @@ -659,6 +628,37 @@ again: } /* + * 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. * * If unsuccessful, we return false, having already taken the dentry lock. |