diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2023-10-30 05:11:58 +0100 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2023-11-25 08:33:42 +0100 |
commit | 15f23734a1def3b22ba790bbf9f0d01949aae231 (patch) | |
tree | 6e92c3a066ecdc4ad2099fb0a8a5f27402f004cf /fs/dcache.c | |
parent | fast_dput(): handle underflows gracefully (diff) | |
download | linux-15f23734a1def3b22ba790bbf9f0d01949aae231.tar.xz linux-15f23734a1def3b22ba790bbf9f0d01949aae231.zip |
fast_dput(): new rules for refcount
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>
Diffstat (limited to 'fs/dcache.c')
-rw-r--r-- | fs/dcache.c | 9 |
1 files changed, 2 insertions, 7 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index 9edabc7e2e64..a00e9ba22480 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -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); |