summaryrefslogtreecommitdiff
path: root/include/linux/file_ref.h
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2025-05-16 10:58:27 +0300
committerTakashi Iwai <tiwai@suse.de>2025-05-16 10:58:35 +0300
commita3d14d1602ca11429d242d230c31af8f822f614f (patch)
treecb15a4235841e657753505538e6715711e7cd151 /include/linux/file_ref.h
parent1c116e5569ef3bd33be1d6f687b0270c0932838d (diff)
parent7b9938a14460e8ec7649ca2e80ac0aae9815bf02 (diff)
downloadlinux-a3d14d1602ca11429d242d230c31af8f822f614f.tar.xz
Merge branch 'for-linus' into for-next
Back-merge of 6.15 devel branch for further development of HD-audio stuff. Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'include/linux/file_ref.h')
-rw-r--r--include/linux/file_ref.h19
1 files changed, 6 insertions, 13 deletions
diff --git a/include/linux/file_ref.h b/include/linux/file_ref.h
index 7db62fbc0500..31551e4cb8f3 100644
--- a/include/linux/file_ref.h
+++ b/include/linux/file_ref.h
@@ -61,7 +61,6 @@ static inline void file_ref_init(file_ref_t *ref, unsigned long cnt)
atomic_long_set(&ref->refcnt, cnt - 1);
}
-bool __file_ref_put_badval(file_ref_t *ref, unsigned long cnt);
bool __file_ref_put(file_ref_t *ref, unsigned long cnt);
/**
@@ -178,20 +177,14 @@ static __always_inline __must_check bool file_ref_put(file_ref_t *ref)
*/
static __always_inline __must_check bool file_ref_put_close(file_ref_t *ref)
{
- long old, new;
+ long old;
old = atomic_long_read(&ref->refcnt);
- do {
- if (unlikely(old < 0))
- return __file_ref_put_badval(ref, old);
-
- if (old == FILE_REF_ONEREF)
- new = FILE_REF_DEAD;
- else
- new = old - 1;
- } while (!atomic_long_try_cmpxchg(&ref->refcnt, &old, new));
-
- return new == FILE_REF_DEAD;
+ if (likely(old == FILE_REF_ONEREF)) {
+ if (likely(atomic_long_try_cmpxchg(&ref->refcnt, &old, FILE_REF_DEAD)))
+ return true;
+ }
+ return file_ref_put(ref);
}
/**