Commit d2cac5b6 authored by Al Viro's avatar Al Viro Committed by Greg Kroah-Hartman

expand dentry_kill(dentry, 0) in shrink_dentry_list()

commit ff2fde99 upstream.

Result will be massaged to saner shape in the next commits.  It is
ugly, no questions - the point of that one is to be a provably
equivalent transformation (and it might be worth splitting a bit
more).
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c233eac2
...@@ -802,6 +802,7 @@ static void shrink_dentry_list(struct list_head *list) ...@@ -802,6 +802,7 @@ static void shrink_dentry_list(struct list_head *list)
struct dentry *dentry, *parent; struct dentry *dentry, *parent;
while (!list_empty(list)) { while (!list_empty(list)) {
struct inode *inode;
dentry = list_entry(list->prev, struct dentry, d_lru); dentry = list_entry(list->prev, struct dentry, d_lru);
spin_lock(&dentry->d_lock); spin_lock(&dentry->d_lock);
/* /*
...@@ -829,23 +830,26 @@ static void shrink_dentry_list(struct list_head *list) ...@@ -829,23 +830,26 @@ static void shrink_dentry_list(struct list_head *list)
continue; continue;
} }
parent = dentry_kill(dentry, 0); inode = dentry->d_inode;
/* if (inode && unlikely(!spin_trylock(&inode->i_lock))) {
* If dentry_kill returns NULL, we have nothing more to do.
*/
if (!parent)
continue;
if (unlikely(parent == dentry)) {
/*
* trylocks have failed and d_lock has been held the
* whole time, so it could not have been added to any
* other lists. Just add it back to the shrink list.
*/
d_shrink_add(dentry, list); d_shrink_add(dentry, list);
spin_unlock(&dentry->d_lock); spin_unlock(&dentry->d_lock);
continue; continue;
} }
parent = NULL;
if (!IS_ROOT(dentry)) {
parent = dentry->d_parent;
if (unlikely(!spin_trylock(&parent->d_lock))) {
if (inode)
spin_unlock(&inode->i_lock);
d_shrink_add(dentry, list);
spin_unlock(&dentry->d_lock);
continue;
}
}
__dentry_kill(dentry);
/* /*
* We need to prune ancestors too. This is necessary to prevent * We need to prune ancestors too. This is necessary to prevent
* quadratic behavior of shrink_dcache_parent(), but is also * quadratic behavior of shrink_dcache_parent(), but is also
......
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