[alsa-devel] [PATCH 3/5] ALSA: dice: ensure to release sound devices after sound card registration fails
Takashi Iwai
tiwai at suse.de
Tue Dec 29 10:00:10 CET 2015
On Sat, 26 Dec 2015 04:35:24 +0100,
Takashi Sakamoto wrote:
>
> When work of sound card registration fails, bus reset on IEEE 1394
> can schedule the work again. In this case, currently instances of PCM and
> RawMIDI devices are not released, but allocated and errors occurs.
>
> This commit solves this issue. The allocated data is kept and released
> at any failures in the work.
Aren't they be released in snd_card_free() in the later error path?
Takashi
>
> Signed-off-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>
> ---
> sound/firewire/dice/dice-midi.c | 2 ++
> sound/firewire/dice/dice-pcm.c | 2 ++
> sound/firewire/dice/dice.c | 30 +++++++++++++++++++++---------
> sound/firewire/dice/dice.h | 2 ++
> 4 files changed, 27 insertions(+), 9 deletions(-)
>
> diff --git a/sound/firewire/dice/dice-midi.c b/sound/firewire/dice/dice-midi.c
> index 151b09f..908b43f 100644
> --- a/sound/firewire/dice/dice-midi.c
> +++ b/sound/firewire/dice/dice-midi.c
> @@ -153,5 +153,7 @@ int snd_dice_create_midi(struct snd_dice *dice)
> if ((midi_out_ports > 0) && (midi_in_ports > 0))
> rmidi->info_flags |= SNDRV_RAWMIDI_INFO_DUPLEX;
>
> + dice->rmidi_dev = rmidi;
> +
> return 0;
> }
> diff --git a/sound/firewire/dice/dice-pcm.c b/sound/firewire/dice/dice-pcm.c
> index 9b34319..6246ce3 100644
> --- a/sound/firewire/dice/dice-pcm.c
> +++ b/sound/firewire/dice/dice-pcm.c
> @@ -426,5 +426,7 @@ int snd_dice_create_pcm(struct snd_dice *dice)
> if (playback > 0)
> snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &playback_ops);
>
> + dice->pcm_dev = pcm;
> +
> return 0;
> }
> diff --git a/sound/firewire/dice/dice.c b/sound/firewire/dice/dice.c
> index 0bc7d08..21ad894 100644
> --- a/sound/firewire/dice/dice.c
> +++ b/sound/firewire/dice/dice.c
> @@ -202,33 +202,45 @@ static void do_registration(struct work_struct *work)
> if (dice->card->shutdown || dice->registered)
> return;
>
> + dice->pcm_dev = NULL;
> + dice->rmidi_dev = NULL;
> +
> err = snd_dice_transaction_init(dice);
> if (err < 0)
> - goto end;
> + goto error;
>
> err = dice_read_params(dice);
> if (err < 0)
> - goto end;
> + goto error;
>
> dice_card_strings(dice);
>
> err = snd_dice_create_pcm(dice);
> if (err < 0)
> - goto end;
> + goto error;
>
> err = snd_dice_create_midi(dice);
> if (err < 0)
> - goto end;
> + goto error;
>
> err = snd_card_register(dice->card);
> if (err < 0)
> - goto end;
> + goto error;
>
> dice->registered = true;
> -end:
> - if (err < 0)
> - dev_info(&dice->unit->device,
> - "Sound card registration failed: %d\n", err);
> +
> + return;
> +error:
> + snd_dice_transaction_destroy(dice);
> +
> + if (dice->pcm_dev)
> + snd_device_free(dice->card, dice->pcm_dev);
> +
> + if (dice->rmidi_dev)
> + snd_device_free(dice->card, dice->rmidi_dev);
> +
> + dev_info(&dice->unit->device,
> + "Sound card registration failed: %d\n", err);
> }
>
> static void schedule_registration(struct snd_dice *dice)
> diff --git a/sound/firewire/dice/dice.h b/sound/firewire/dice/dice.h
> index 3d5ebeb..d632ac1 100644
> --- a/sound/firewire/dice/dice.h
> +++ b/sound/firewire/dice/dice.h
> @@ -47,6 +47,8 @@ struct snd_dice {
>
> bool registered;
> struct delayed_work dwork;
> + struct snd_pcm *pcm_dev;
> + struct snd_rawmidi *rmidi_dev;
>
> /* Offsets for sub-addresses */
> unsigned int global_offset;
> --
> 2.5.0
>
More information about the Alsa-devel
mailing list