.. | .. |
---|
800 | 800 | if (mutex_lock_interruptible(&dmxdev->mutex)) |
---|
801 | 801 | return -ERESTARTSYS; |
---|
802 | 802 | |
---|
| 803 | + if (dmxdev->exit) { |
---|
| 804 | + mutex_unlock(&dmxdev->mutex); |
---|
| 805 | + return -ENODEV; |
---|
| 806 | + } |
---|
| 807 | + |
---|
803 | 808 | for (i = 0; i < dmxdev->filternum; i++) |
---|
804 | 809 | if (dmxdev->filter[i].state == DMXDEV_STATE_FREE) |
---|
805 | 810 | break; |
---|
.. | .. |
---|
1195 | 1200 | struct dmxdev_filter *dmxdevfilter = file->private_data; |
---|
1196 | 1201 | __poll_t mask = 0; |
---|
1197 | 1202 | |
---|
| 1203 | + poll_wait(file, &dmxdevfilter->buffer.queue, wait); |
---|
| 1204 | + |
---|
1198 | 1205 | if ((!dmxdevfilter) || dmxdevfilter->dev->exit) |
---|
1199 | 1206 | return EPOLLERR; |
---|
1200 | 1207 | if (dvb_vb2_is_streaming(&dmxdevfilter->vb2_ctx)) |
---|
1201 | 1208 | return dvb_vb2_poll(&dmxdevfilter->vb2_ctx, file, wait); |
---|
1202 | | - |
---|
1203 | | - poll_wait(file, &dmxdevfilter->buffer.queue, wait); |
---|
1204 | 1209 | |
---|
1205 | 1210 | if (dmxdevfilter->state != DMXDEV_STATE_GO && |
---|
1206 | 1211 | dmxdevfilter->state != DMXDEV_STATE_DONE && |
---|
.. | .. |
---|
1265 | 1270 | .owner = THIS_MODULE, |
---|
1266 | 1271 | .read = dvb_demux_read, |
---|
1267 | 1272 | .unlocked_ioctl = dvb_demux_ioctl, |
---|
| 1273 | + .compat_ioctl = dvb_demux_ioctl, |
---|
1268 | 1274 | .open = dvb_demux_open, |
---|
1269 | 1275 | .release = dvb_demux_release, |
---|
1270 | 1276 | .poll = dvb_demux_poll, |
---|
.. | .. |
---|
1345 | 1351 | |
---|
1346 | 1352 | dprintk("%s\n", __func__); |
---|
1347 | 1353 | |
---|
| 1354 | + poll_wait(file, &dmxdev->dvr_buffer.queue, wait); |
---|
| 1355 | + |
---|
1348 | 1356 | if (dmxdev->exit) |
---|
1349 | 1357 | return EPOLLERR; |
---|
1350 | 1358 | if (dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx)) |
---|
1351 | 1359 | return dvb_vb2_poll(&dmxdev->dvr_vb2_ctx, file, wait); |
---|
1352 | | - |
---|
1353 | | - poll_wait(file, &dmxdev->dvr_buffer.queue, wait); |
---|
1354 | 1360 | |
---|
1355 | 1361 | if (((file->f_flags & O_ACCMODE) == O_RDONLY) || |
---|
1356 | 1362 | dmxdev->may_do_mmap) { |
---|
.. | .. |
---|
1457 | 1463 | |
---|
1458 | 1464 | void dvb_dmxdev_release(struct dmxdev *dmxdev) |
---|
1459 | 1465 | { |
---|
| 1466 | + mutex_lock(&dmxdev->mutex); |
---|
1460 | 1467 | dmxdev->exit = 1; |
---|
| 1468 | + mutex_unlock(&dmxdev->mutex); |
---|
| 1469 | + |
---|
1461 | 1470 | if (dmxdev->dvbdev->users > 1) { |
---|
1462 | 1471 | wait_event(dmxdev->dvbdev->wait_queue, |
---|
1463 | 1472 | dmxdev->dvbdev->users == 1); |
---|