mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
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
This commit is contained in:
parent
83615ff7c6
commit
c6c6f0aec6
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user