sound: rawmidi: fix double init when opening MIDI device with O_APPEND

Commit 9a1b64caac in 2.6.30 moved the
substream initialization code to where it would be executed every time
the substream is opened.

This had the consequence that any further opening would drop and leak
the data in the existing buffer, and that the device driver's open
callback would be called multiple times, unexpectedly.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Cc: <stable@kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Clemens Ladisch 2009-10-21 09:09:38 +02:00 коммит произвёл Takashi Iwai
Родитель dede17b8e9
Коммит 8579d2d777
1 изменённых файлов: 12 добавлений и 10 удалений

Просмотреть файл

@ -266,17 +266,19 @@ static int open_substream(struct snd_rawmidi *rmidi,
{
int err;
err = snd_rawmidi_runtime_create(substream);
if (err < 0)
return err;
err = substream->ops->open(substream);
if (err < 0)
return err;
substream->opened = 1;
if (substream->use_count++ == 0)
if (substream->use_count == 0) {
err = snd_rawmidi_runtime_create(substream);
if (err < 0)
return err;
err = substream->ops->open(substream);
if (err < 0)
return err;
substream->opened = 1;
substream->active_sensing = 0;
if (mode & SNDRV_RAWMIDI_LFLG_APPEND)
substream->append = 1;
if (mode & SNDRV_RAWMIDI_LFLG_APPEND)
substream->append = 1;
}
substream->use_count++;
rmidi->streams[substream->stream].substream_opened++;
return 0;
}