summaryrefslogtreecommitdiff
path: root/fs/dcache.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2023-11-07 15:21:33 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2023-11-25 02:33:41 -0500
commit3fcf535626a44e107e2d536a2c43da0fb5bde121 (patch)
tree7ce182859df02b55fcad0dd6f12652a301b7abf5 /fs/dcache.c
parentda549bdd15c295c24b2ee7ffe7ad0f3877fa8a87 (diff)
centralize killing dentry from shrink list
new helper unifying identical bits of shrink_dentry_list() and shring_dcache_for_umount() Reviewed-by: Christian Brauner <brauner@kernel.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/dcache.c')
-rw-r--r--fs/dcache.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/fs/dcache.c b/fs/dcache.c
index 59f76c9a15d1..bb862a304e1b 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1174,10 +1174,18 @@ out:
return false;
}
+static inline void shrink_kill(struct dentry *victim, struct list_head *list)
+{
+ struct dentry *parent = victim->d_parent;
+ if (parent != victim)
+ __dput_to_list(parent, list);
+ __dentry_kill(victim);
+}
+
void shrink_dentry_list(struct list_head *list)
{
while (!list_empty(list)) {
- struct dentry *dentry, *parent;
+ struct dentry *dentry;
dentry = list_entry(list->prev, struct dentry, d_lru);
spin_lock(&dentry->d_lock);
@@ -1195,10 +1203,7 @@ void shrink_dentry_list(struct list_head *list)
}
rcu_read_unlock();
d_shrink_del(dentry);
- parent = dentry->d_parent;
- if (parent != dentry)
- __dput_to_list(parent, list);
- __dentry_kill(dentry);
+ shrink_kill(dentry, list);
}
}
@@ -1629,17 +1634,13 @@ void shrink_dcache_parent(struct dentry *parent)
data.victim = NULL;
d_walk(parent, &data, select_collect2);
if (data.victim) {
- struct dentry *parent;
spin_lock(&data.victim->d_lock);
if (!shrink_lock_dentry(data.victim)) {
spin_unlock(&data.victim->d_lock);
rcu_read_unlock();
} else {
rcu_read_unlock();
- parent = data.victim->d_parent;
- if (parent != data.victim)
- __dput_to_list(parent, &data.dispose);
- __dentry_kill(data.victim);
+ shrink_kill(data.victim, &data.dispose);
}
}
if (!list_empty(&data.dispose))