[alsa-devel] [PATCH 3/5] ALSA: dice: ensure to release sound devices after sound card registration fails
Takashi Sakamoto
o-takashi at sakamocchi.jp
Tue Dec 29 11:56:04 CET 2015
On 2015年12月29日 18:00, Takashi Iwai wrote:
> 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?
Not in the error path, but indeed in card free processing. They're not
released anymore. I should have used snd_pcm_free() and
snd_rawmidi_free() for this purpose. (I misunderstand they should be
used after calling snd_card_register().)
Thanks
Takashi Sakamoto
> 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