hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/media/dvb-core/dmxdev.c
....@@ -800,6 +800,11 @@
800800 if (mutex_lock_interruptible(&dmxdev->mutex))
801801 return -ERESTARTSYS;
802802
803
+ if (dmxdev->exit) {
804
+ mutex_unlock(&dmxdev->mutex);
805
+ return -ENODEV;
806
+ }
807
+
803808 for (i = 0; i < dmxdev->filternum; i++)
804809 if (dmxdev->filter[i].state == DMXDEV_STATE_FREE)
805810 break;
....@@ -1195,12 +1200,12 @@
11951200 struct dmxdev_filter *dmxdevfilter = file->private_data;
11961201 __poll_t mask = 0;
11971202
1203
+ poll_wait(file, &dmxdevfilter->buffer.queue, wait);
1204
+
11981205 if ((!dmxdevfilter) || dmxdevfilter->dev->exit)
11991206 return EPOLLERR;
12001207 if (dvb_vb2_is_streaming(&dmxdevfilter->vb2_ctx))
12011208 return dvb_vb2_poll(&dmxdevfilter->vb2_ctx, file, wait);
1202
-
1203
- poll_wait(file, &dmxdevfilter->buffer.queue, wait);
12041209
12051210 if (dmxdevfilter->state != DMXDEV_STATE_GO &&
12061211 dmxdevfilter->state != DMXDEV_STATE_DONE &&
....@@ -1265,6 +1270,7 @@
12651270 .owner = THIS_MODULE,
12661271 .read = dvb_demux_read,
12671272 .unlocked_ioctl = dvb_demux_ioctl,
1273
+ .compat_ioctl = dvb_demux_ioctl,
12681274 .open = dvb_demux_open,
12691275 .release = dvb_demux_release,
12701276 .poll = dvb_demux_poll,
....@@ -1345,12 +1351,12 @@
13451351
13461352 dprintk("%s\n", __func__);
13471353
1354
+ poll_wait(file, &dmxdev->dvr_buffer.queue, wait);
1355
+
13481356 if (dmxdev->exit)
13491357 return EPOLLERR;
13501358 if (dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx))
13511359 return dvb_vb2_poll(&dmxdev->dvr_vb2_ctx, file, wait);
1352
-
1353
- poll_wait(file, &dmxdev->dvr_buffer.queue, wait);
13541360
13551361 if (((file->f_flags & O_ACCMODE) == O_RDONLY) ||
13561362 dmxdev->may_do_mmap) {
....@@ -1457,7 +1463,10 @@
14571463
14581464 void dvb_dmxdev_release(struct dmxdev *dmxdev)
14591465 {
1466
+ mutex_lock(&dmxdev->mutex);
14601467 dmxdev->exit = 1;
1468
+ mutex_unlock(&dmxdev->mutex);
1469
+
14611470 if (dmxdev->dvbdev->users > 1) {
14621471 wait_event(dmxdev->dvbdev->wait_queue,
14631472 dmxdev->dvbdev->users == 1);