hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/media/dvb-core/dvb_net.c
....@@ -1564,15 +1564,43 @@
15641564 return dvb_usercopy(file, cmd, arg, dvb_net_do_ioctl);
15651565 }
15661566
1567
+static int locked_dvb_net_open(struct inode *inode, struct file *file)
1568
+{
1569
+ struct dvb_device *dvbdev = file->private_data;
1570
+ struct dvb_net *dvbnet = dvbdev->priv;
1571
+ int ret;
1572
+
1573
+ if (mutex_lock_interruptible(&dvbnet->remove_mutex))
1574
+ return -ERESTARTSYS;
1575
+
1576
+ if (dvbnet->exit) {
1577
+ mutex_unlock(&dvbnet->remove_mutex);
1578
+ return -ENODEV;
1579
+ }
1580
+
1581
+ ret = dvb_generic_open(inode, file);
1582
+
1583
+ mutex_unlock(&dvbnet->remove_mutex);
1584
+
1585
+ return ret;
1586
+}
1587
+
15671588 static int dvb_net_close(struct inode *inode, struct file *file)
15681589 {
15691590 struct dvb_device *dvbdev = file->private_data;
15701591 struct dvb_net *dvbnet = dvbdev->priv;
15711592
1593
+ mutex_lock(&dvbnet->remove_mutex);
1594
+
15721595 dvb_generic_release(inode, file);
15731596
1574
- if(dvbdev->users == 1 && dvbnet->exit == 1)
1597
+ if (dvbdev->users == 1 && dvbnet->exit == 1) {
1598
+ mutex_unlock(&dvbnet->remove_mutex);
15751599 wake_up(&dvbdev->wait_queue);
1600
+ } else {
1601
+ mutex_unlock(&dvbnet->remove_mutex);
1602
+ }
1603
+
15761604 return 0;
15771605 }
15781606
....@@ -1580,7 +1608,7 @@
15801608 static const struct file_operations dvb_net_fops = {
15811609 .owner = THIS_MODULE,
15821610 .unlocked_ioctl = dvb_net_ioctl,
1583
- .open = dvb_generic_open,
1611
+ .open = locked_dvb_net_open,
15841612 .release = dvb_net_close,
15851613 .llseek = noop_llseek,
15861614 };
....@@ -1599,10 +1627,13 @@
15991627 {
16001628 int i;
16011629
1630
+ mutex_lock(&dvbnet->remove_mutex);
16021631 dvbnet->exit = 1;
1632
+ mutex_unlock(&dvbnet->remove_mutex);
1633
+
16031634 if (dvbnet->dvbdev->users < 1)
16041635 wait_event(dvbnet->dvbdev->wait_queue,
1605
- dvbnet->dvbdev->users==1);
1636
+ dvbnet->dvbdev->users == 1);
16061637
16071638 dvb_unregister_device(dvbnet->dvbdev);
16081639
....@@ -1621,6 +1652,7 @@
16211652 int i;
16221653
16231654 mutex_init(&dvbnet->ioctl_mutex);
1655
+ mutex_init(&dvbnet->remove_mutex);
16241656 dvbnet->demux = dmx;
16251657
16261658 for (i=0; i<DVB_NET_DEVICES_MAX; i++)