fold dentry_kill() into dput()
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 31 Oct 2023 05:41:22 +0000 (01:41 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 25 Nov 2023 07:34:12 +0000 (02:34 -0500)
Reviewed-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/dcache.c

index a7f99d46c41b0c4e01019225fc83355f9a6991cc..5284b02747cd9eee0ba822dd2cabca5ff6e4d07d 100644 (file)
@@ -756,28 +756,6 @@ void d_mark_dontcache(struct inode *inode)
 }
 EXPORT_SYMBOL(d_mark_dontcache);
 
-/*
- * Finish off a dentry we've decided to kill.
- * dentry->d_lock must be held, returns with it unlocked.
- * Returns dentry requiring refcount drop, or NULL if we're done.
- */
-static struct dentry *dentry_kill(struct dentry *dentry)
-       __releases(dentry->d_lock)
-{
-
-       dentry->d_lockref.count--;
-       rcu_read_lock();
-       if (likely(lock_for_kill(dentry))) {
-               struct dentry *parent = dentry->d_parent;
-               rcu_read_unlock();
-               __dentry_kill(dentry);
-               return parent != dentry ? parent : NULL;
-       }
-       rcu_read_unlock();
-       spin_unlock(&dentry->d_lock);
-       return NULL;
-}
-
 /*
  * Try to do a lockless dput(), and return whether that was successful.
  *
@@ -915,9 +893,18 @@ void dput(struct dentry *dentry)
                }
 
                /* Slow case: now with the dentry lock held */
-               rcu_read_unlock();
-               dentry->d_lockref.count = 1;
-               dentry = dentry_kill(dentry);
+               if (likely(lock_for_kill(dentry))) {
+                       struct dentry *parent = dentry->d_parent;
+                       rcu_read_unlock();
+                       __dentry_kill(dentry);
+                       if (dentry == parent)
+                               return;
+                       dentry = parent;
+               } else {
+                       rcu_read_unlock();
+                       spin_unlock(&dentry->d_lock);
+                       return;
+               }
        }
 }
 EXPORT_SYMBOL(dput);