Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8b987a46 authored by Al Viro's avatar Al Viro
Browse files

split the slow part of lock_parent() off



Turn the "trylock failed" part into uninlined __lock_parent().

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 65d8eb5a
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -588,13 +588,9 @@ static void __dentry_kill(struct dentry *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(struct dentry *dentry)
	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.