fast_dput(): new rules for refcount
authorAl Viro <viro@zeniv.linux.org.uk>
Mon, 30 Oct 2023 04:11:58 +0000 (00:11 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 25 Nov 2023 07:33:42 +0000 (02:33 -0500)
By now there is only one place in entire fast_dput() where we return
false; that happens after refcount had been decremented and found (under
->d_lock) to be zero.  In that case, just prior to returning false to
caller, fast_dput() forcibly changes the refcount from 0 to 1.

Lift that resetting refcount to 1 into the callers; later in the series
it will be massaged out of existence.

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

index 9edabc7e2e64e4cdf2c09b1ff9775a82617c8670..a00e9ba22480ecbd7e605e3bff9d9e73d0a819ef 100644 (file)
@@ -847,13 +847,6 @@ locked:
                spin_unlock(&dentry->d_lock);
                return true;
        }
-
-       /*
-        * Re-get the reference we optimistically dropped. We hold the
-        * lock, and we just tested that it was zero, so we can just
-        * set it to 1.
-        */
-       dentry->d_lockref.count = 1;
        return false;
 }
 
@@ -896,6 +889,7 @@ void dput(struct dentry *dentry)
                }
 
                /* Slow case: now with the dentry lock held */
+               dentry->d_lockref.count = 1;
                rcu_read_unlock();
 
                if (likely(retain_dentry(dentry))) {
@@ -930,6 +924,7 @@ void dput_to_list(struct dentry *dentry, struct list_head *list)
                return;
        }
        rcu_read_unlock();
+       dentry->d_lockref.count = 1;
        if (!retain_dentry(dentry))
                __dput_to_list(dentry, list);
        spin_unlock(&dentry->d_lock);