]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
centralize killing dentry from shrink list
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 7 Nov 2023 20:21:33 +0000 (15:21 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 25 Nov 2023 07:33:41 +0000 (02:33 -0500)
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>
fs/dcache.c

index 59f76c9a15d1b7388b2f435cc57bce03e716502a..bb862a304e1ba9ddc7b04ad49dd63ebfe55c6b6e 100644 (file)
@@ -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))