]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fold the call of retain_dentry() into fast_dput()
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 31 Oct 2023 04:45:40 +0000 (00:45 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 25 Nov 2023 07:34:12 +0000 (02:34 -0500)
Calls of retain_dentry() happen immediately after getting false
from fast_dput() and getting true from retain_dentry() is
treated the same way as non-zero refcount would be treated by
fast_dput() - unlock dentry and bugger off.

Doing that in fast_dput() itself is simpler.

Reviewed-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/dcache.c

index 8ce0fe70f3033442ec5c358d94977d62c0d13a45..b69ff3a0b30f21f4e49da96e5902374f21dda5b2 100644 (file)
@@ -757,6 +757,8 @@ got_locks:
  * Try to do a lockless dput(), and return whether that was successful.
  *
  * If unsuccessful, we return false, having already taken the dentry lock.
+ * In that case refcount is guaranteed to be zero and we have already
+ * decided that it's not worth keeping around.
  *
  * The caller needs to hold the RCU read lock, so that the dentry is
  * guaranteed to stay around even if the refcount goes down to zero!
@@ -842,7 +844,7 @@ static inline bool fast_dput(struct dentry *dentry)
         * don't need to do anything else.
         */
 locked:
-       if (dentry->d_lockref.count) {
+       if (dentry->d_lockref.count || retain_dentry(dentry)) {
                spin_unlock(&dentry->d_lock);
                return true;
        }
@@ -889,12 +891,6 @@ void dput(struct dentry *dentry)
 
                /* Slow case: now with the dentry lock held */
                rcu_read_unlock();
-
-               if (likely(retain_dentry(dentry))) {
-                       spin_unlock(&dentry->d_lock);
-                       return;
-               }
-
                dentry->d_lockref.count = 1;
                dentry = dentry_kill(dentry);
        }
@@ -920,8 +916,7 @@ void dput_to_list(struct dentry *dentry, struct list_head *list)
                return;
        }
        rcu_read_unlock();
-       if (!retain_dentry(dentry))
-               to_shrink_list(dentry, list);
+       to_shrink_list(dentry, list);
        spin_unlock(&dentry->d_lock);
 }