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@xxxxxxxxxxxxx> > --- > 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 > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel