50 lines
1.4 KiB
Diff
50 lines
1.4 KiB
Diff
From: Al Viro <viro@zeniv.linux.org.uk>
|
|
Date: Fri, 23 Feb 2018 22:11:34 -0500
|
|
Subject: [PATCH 03/17] split the slow part of lock_parent() off
|
|
|
|
Upstream commit 8b987a46a1e0e93d4cb4babea06ea274e2e2b658
|
|
|
|
Turn the "trylock failed" part into uninlined __lock_parent().
|
|
|
|
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
|
|
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
---
|
|
fs/dcache.c | 18 ++++++++++++------
|
|
1 file changed, 12 insertions(+), 6 deletions(-)
|
|
|
|
--- a/fs/dcache.c
|
|
+++ b/fs/dcache.c
|
|
@@ -588,13 +588,9 @@ static void __dentry_kill(struct dentry
|
|
dentry_free(dentry);
|
|
}
|
|
|
|
-static inline struct dentry *lock_parent(struct dentry *dentry)
|
|
+static struct dentry *__lock_parent(struct dentry *dentry)
|
|
{
|
|
- struct dentry *parent = dentry->d_parent;
|
|
- if (IS_ROOT(dentry))
|
|
- return NULL;
|
|
- if (likely(spin_trylock(&parent->d_lock)))
|
|
- return parent;
|
|
+ struct dentry *parent;
|
|
rcu_read_lock();
|
|
spin_unlock(&dentry->d_lock);
|
|
again:
|
|
@@ -620,6 +616,16 @@ static inline struct dentry *lock_parent
|
|
return parent;
|
|
}
|
|
|
|
+static inline struct dentry *lock_parent(struct dentry *dentry)
|
|
+{
|
|
+ struct dentry *parent = dentry->d_parent;
|
|
+ if (IS_ROOT(dentry))
|
|
+ return NULL;
|
|
+ if (likely(spin_trylock(&parent->d_lock)))
|
|
+ return parent;
|
|
+ return __lock_parent(dentry);
|
|
+}
|
|
+
|
|
/*
|
|
* Finish off a dentry we've decided to kill.
|
|
* dentry->d_lock must be held, returns with it unlocked.
|