All of lore.kernel.org
 help / color / mirror / Atom feed
From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
To: clemens@ladisch.de, tiwai@suse.de
Cc: alsa-devel@alsa-project.org, stefanr@s5r6.in-berlin.de,
	ffado-devel@lists.sf.net
Subject: [PATCH 3/5] ALSA: dice: ensure to release sound devices after sound card registration fails
Date: Sat, 26 Dec 2015 12:35:24 +0900	[thread overview]
Message-ID: <1451100926-20637-4-git-send-email-o-takashi@sakamocchi.jp> (raw)
In-Reply-To: <1451100926-20637-1-git-send-email-o-takashi@sakamocchi.jp>

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.

Signed-off-by: Takashi Sakamoto <o-takashi@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

  parent reply	other threads:[~2015-12-26  3:35 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-26  3:35 [PATCH 0/5 v4] ALSA: dice: improve card registration processing Takashi Sakamoto
2015-12-26  3:35 ` [PATCH 1/5] ALSA: dice: split subaddress check from category check Takashi Sakamoto
2015-12-29  8:54   ` Takashi Iwai
2015-12-29  9:33     ` Takashi Sakamoto
2015-12-26  3:35 ` [PATCH 2/5] ALSA: dice: postpone card registration Takashi Sakamoto
2015-12-26  3:35 ` Takashi Sakamoto [this message]
2015-12-29  9:00   ` [PATCH 3/5] ALSA: dice: ensure to release sound devices after sound card registration fails Takashi Iwai
2015-12-29 10:56     ` Takashi Sakamoto
2015-12-29 11:37       ` Takashi Sakamoto
2015-12-30  8:09         ` Takashi Iwai
2015-12-30 14:06           ` Takashi Sakamoto
2015-12-26  3:35 ` [PATCH 4/5] ALSA: dice: purge transaction initialization at timeout of Dice notification Takashi Sakamoto
2015-12-26  3:35 ` [PATCH 5/5] ALSA: dice: expand timeout to wait for " Takashi Sakamoto
  -- strict thread matches above, loose matches on Subject: below --
2015-12-25  1:13 [PATCH 0/5 v3] ALSA: dice: improve card registration processing Takashi Sakamoto
2015-12-25  1:13 ` [PATCH 3/5] ALSA: dice: ensure to release sound devices after sound card registration fails Takashi Sakamoto

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1451100926-20637-4-git-send-email-o-takashi@sakamocchi.jp \
    --to=o-takashi@sakamocchi.jp \
    --cc=alsa-devel@alsa-project.org \
    --cc=clemens@ladisch.de \
    --cc=ffado-devel@lists.sf.net \
    --cc=stefanr@s5r6.in-berlin.de \
    --cc=tiwai@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.