diff options
| author | Cássio Gabriel <cassiogabrielcontato@gmail.com> | 2026-06-04 01:48:13 -0300 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2026-06-04 10:20:41 +0200 |
| commit | c6c6f0aec6fb4cbcc547bb265315fd76f18be731 (patch) | |
| tree | 397dec1d2152b1eb96dceb63b82ec449b59192a5 | |
| parent | 83615ff7c61ce2336b81b68cfbba6eadaf7843e9 (diff) | |
| download | linux-c6c6f0aec6fb4cbcc547bb265315fd76f18be731.tar.gz linux-c6c6f0aec6fb4cbcc547bb265315fd76f18be731.zip | |
ALSA: core: Add scoped cleanup helper for card references
Several ALSA paths acquire temporary card references with snd_card_ref()
and release them manually with snd_card_unref(). control_led.c already
defines a local cleanup helper for this pattern, while other core paths
still open-code the release.
Move the helper to the common ALSA core header and use it in control-layer
card-reference paths. This makes the ownership rule explicit and avoids
future missing-unref mistakes when adding early exits.
No functional change is intended.
Signed-off-by: Cássio Gabriel <cassiogabrielcontato@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://patch.msgid.link/20260604-alsa-scoped-cleanups-v1-2-10c43152a728@gmail.com
| -rw-r--r-- | include/sound/core.h | 2 | ||||
| -rw-r--r-- | sound/core/control.c | 6 | ||||
| -rw-r--r-- | sound/core/control_led.c | 11 |
3 files changed, 9 insertions, 10 deletions
diff --git a/include/sound/core.h b/include/sound/core.h index 4bb76c21c956..8b2ca95d13f7 100644 --- a/include/sound/core.h +++ b/include/sound/core.h @@ -319,6 +319,8 @@ static inline void snd_card_unref(struct snd_card *card) put_device(&card->card_dev); } +DEFINE_FREE(snd_card_unref, struct snd_card *, if (_T) snd_card_unref(_T)) + #define snd_card_set_dev(card, devptr) ((card)->dev = (devptr)) /* device.c */ diff --git a/sound/core/control.c b/sound/core/control.c index 28fffbe92e66..7a8dc506221e 100644 --- a/sound/core/control.c +++ b/sound/core/control.c @@ -2291,7 +2291,6 @@ EXPORT_SYMBOL_GPL(snd_ctl_request_layer); */ void snd_ctl_register_layer(struct snd_ctl_layer_ops *lops) { - struct snd_card *card; int card_number; scoped_guard(rwsem_write, &snd_ctl_layer_rwsem) { @@ -2299,11 +2298,12 @@ void snd_ctl_register_layer(struct snd_ctl_layer_ops *lops) snd_ctl_layer = lops; } for (card_number = 0; card_number < SNDRV_CARDS; card_number++) { - card = snd_card_ref(card_number); + struct snd_card *card __free(snd_card_unref) = + snd_card_ref(card_number); + if (card) { scoped_guard(rwsem_read, &card->controls_rwsem) lops->lregister(card); - snd_card_unref(card); } } } diff --git a/sound/core/control_led.c b/sound/core/control_led.c index d92b36ab5ec6..8cbacee57ce7 100644 --- a/sound/core/control_led.c +++ b/sound/core/control_led.c @@ -240,8 +240,6 @@ static void snd_ctl_led_notify(struct snd_card *card, unsigned int mask, } } -DEFINE_FREE(snd_card_unref, struct snd_card *, if (_T) snd_card_unref(_T)) - static int snd_ctl_led_set_id(int card_number, struct snd_ctl_elem_id *id, unsigned int group, bool set) { @@ -758,18 +756,17 @@ static int __init snd_ctl_led_init(void) static void __exit snd_ctl_led_exit(void) { struct snd_ctl_led *led; - struct snd_card *card; unsigned int group, card_number; snd_ctl_disconnect_layer(&snd_ctl_led_lops); for (card_number = 0; card_number < SNDRV_CARDS; card_number++) { if (!snd_ctl_led_card_valid[card_number]) continue; - card = snd_card_ref(card_number); - if (card) { + struct snd_card *card __free(snd_card_unref) = + snd_card_ref(card_number); + + if (card) snd_ctl_led_sysfs_remove(card); - snd_card_unref(card); - } } for (group = 0; group < MAX_LED; group++) { led = &snd_ctl_leds[group]; |
