]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ALSA: core: Add scoped cleanup helper for card references
authorCássio Gabriel <cassiogabrielcontato@gmail.com>
Thu, 4 Jun 2026 04:48:13 +0000 (01:48 -0300)
committerTakashi Iwai <tiwai@suse.de>
Thu, 4 Jun 2026 08:20:41 +0000 (10:20 +0200)
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
include/sound/core.h
sound/core/control.c
sound/core/control_led.c

index 4bb76c21c9565971beccf7e0d6a3141f14a0ed65..8b2ca95d13f7db4dba8d227f165e857c6274b874 100644 (file)
@@ -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 */
index 28fffbe92e6649d26b060ffe2e85c5879a6f711d..7a8dc506221e9850edcca5292817129d0829161b 100644 (file)
@@ -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);
                }
        }
 }
index d92b36ab5ec6cdaab88f18872d839df8841988cb..8cbacee57ce70b0dbbfb61f937d89c73a0871eff 100644 (file)
@@ -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];