if (PCM_RUNTIME_CHECK(substream))
                return -ENXIO;
 
+       if (substream->runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED)
+               return -EBADFD;
+
        res = snd_power_wait(substream->pcm->card);
        if (res < 0)
                return res;
        snd_pcm_uframes_t *frames = arg;
        snd_pcm_sframes_t result;
        
+       if (substream->runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED)
+               return -EBADFD;
+
        switch (cmd) {
        case SNDRV_PCM_IOCTL_FORWARD:
        {
        if (PCM_RUNTIME_CHECK(substream))
                return -ENXIO;
        runtime = substream->runtime;
-       if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
+       if (runtime->status->state == SNDRV_PCM_STATE_OPEN ||
+           runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED)
                return -EBADFD;
        if (!frame_aligned(runtime, count))
                return -EINVAL;
        if (PCM_RUNTIME_CHECK(substream))
                return -ENXIO;
        runtime = substream->runtime;
-       if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
+       if (runtime->status->state == SNDRV_PCM_STATE_OPEN ||
+           runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED)
                return -EBADFD;
        if (!frame_aligned(runtime, count))
                return -EINVAL;
        if (PCM_RUNTIME_CHECK(substream))
                return -ENXIO;
        runtime = substream->runtime;
-       if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
+       if (runtime->status->state == SNDRV_PCM_STATE_OPEN ||
+           runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED)
                return -EBADFD;
        if (!iter_is_iovec(to))
                return -EINVAL;
        if (PCM_RUNTIME_CHECK(substream))
                return -ENXIO;
        runtime = substream->runtime;
-       if (runtime->status->state == SNDRV_PCM_STATE_OPEN)
+       if (runtime->status->state == SNDRV_PCM_STATE_OPEN ||
+           runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED)
                return -EBADFD;
        if (!iter_is_iovec(from))
                return -EINVAL;
                return ok | EPOLLERR;
 
        runtime = substream->runtime;
+       if (runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED)
+               return ok | EPOLLERR;
+
        poll_wait(file, &runtime->sleep, wait);
 
        mask = 0;
        substream = pcm_file->substream;
        if (PCM_RUNTIME_CHECK(substream))
                return -ENXIO;
+       if (substream->runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED)
+               return -EBADFD;
 
        offset = area->vm_pgoff << PAGE_SHIFT;
        switch (offset) {
        if (PCM_RUNTIME_CHECK(substream))
                return -ENXIO;
        runtime = substream->runtime;
+       if (runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED)
+               return -EBADFD;
        return fasync_helper(fd, file, on, &runtime->fasync);
 }