hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
kernel/drivers/media/dvb-core/dvbdev.c
....@@ -37,6 +37,7 @@
3737 #include <media/tuner.h>
3838
3939 static DEFINE_MUTEX(dvbdev_mutex);
40
+static LIST_HEAD(dvbdevfops_list);
4041 static int dvbdev_debug;
4142
4243 module_param(dvbdev_debug, int, 0644);
....@@ -107,7 +108,7 @@
107108 new_fops = fops_get(dvbdev->fops);
108109 if (!new_fops)
109110 goto fail;
110
- file->private_data = dvbdev;
111
+ file->private_data = dvb_device_get(dvbdev);
111112 replace_fops(file, new_fops);
112113 if (file->f_op->open)
113114 err = file->f_op->open(inode, file);
....@@ -171,6 +172,9 @@
171172 }
172173
173174 dvbdev->users++;
175
+
176
+ dvb_device_put(dvbdev);
177
+
174178 return 0;
175179 }
176180 EXPORT_SYMBOL(dvb_generic_release);
....@@ -342,6 +346,7 @@
342346 GFP_KERNEL);
343347 if (!dvbdev->pads) {
344348 kfree(dvbdev->entity);
349
+ dvbdev->entity = NULL;
345350 return -ENOMEM;
346351 }
347352 }
....@@ -458,14 +463,15 @@
458463 enum dvb_device_type type, int demux_sink_pads)
459464 {
460465 struct dvb_device *dvbdev;
461
- struct file_operations *dvbdevfops;
466
+ struct file_operations *dvbdevfops = NULL;
467
+ struct dvbdevfops_node *node = NULL, *new_node = NULL;
462468 struct device *clsdev;
463469 int minor;
464470 int id, ret;
465471
466472 mutex_lock(&dvbdev_register_lock);
467473
468
- if ((id = dvbdev_get_free_id (adap, type)) < 0){
474
+ if ((id = dvbdev_get_free_id (adap, type)) < 0) {
469475 mutex_unlock(&dvbdev_register_lock);
470476 *pdvbdev = NULL;
471477 pr_err("%s: couldn't find free device id\n", __func__);
....@@ -473,41 +479,69 @@
473479 }
474480
475481 *pdvbdev = dvbdev = kzalloc(sizeof(*dvbdev), GFP_KERNEL);
476
-
477482 if (!dvbdev){
478483 mutex_unlock(&dvbdev_register_lock);
479484 return -ENOMEM;
480485 }
481486
482
- dvbdevfops = kzalloc(sizeof(struct file_operations), GFP_KERNEL);
487
+ /*
488
+ * When a device of the same type is probe()d more than once,
489
+ * the first allocated fops are used. This prevents memory leaks
490
+ * that can occur when the same device is probe()d repeatedly.
491
+ */
492
+ list_for_each_entry(node, &dvbdevfops_list, list_head) {
493
+ if (node->fops->owner == adap->module &&
494
+ node->type == type &&
495
+ node->template == template) {
496
+ dvbdevfops = node->fops;
497
+ break;
498
+ }
499
+ }
483500
484
- if (!dvbdevfops){
485
- kfree (dvbdev);
486
- mutex_unlock(&dvbdev_register_lock);
487
- return -ENOMEM;
501
+ if (dvbdevfops == NULL) {
502
+ dvbdevfops = kmemdup(template->fops, sizeof(*dvbdevfops), GFP_KERNEL);
503
+ if (!dvbdevfops) {
504
+ kfree(dvbdev);
505
+ mutex_unlock(&dvbdev_register_lock);
506
+ return -ENOMEM;
507
+ }
508
+
509
+ new_node = kzalloc(sizeof(struct dvbdevfops_node), GFP_KERNEL);
510
+ if (!new_node) {
511
+ kfree(dvbdevfops);
512
+ kfree(dvbdev);
513
+ mutex_unlock(&dvbdev_register_lock);
514
+ return -ENOMEM;
515
+ }
516
+
517
+ new_node->fops = dvbdevfops;
518
+ new_node->type = type;
519
+ new_node->template = template;
520
+ list_add_tail (&new_node->list_head, &dvbdevfops_list);
488521 }
489522
490523 memcpy(dvbdev, template, sizeof(struct dvb_device));
524
+ kref_init(&dvbdev->ref);
491525 dvbdev->type = type;
492526 dvbdev->id = id;
493527 dvbdev->adapter = adap;
494528 dvbdev->priv = priv;
495529 dvbdev->fops = dvbdevfops;
496530 init_waitqueue_head (&dvbdev->wait_queue);
497
-
498
- memcpy(dvbdevfops, template->fops, sizeof(struct file_operations));
499531 dvbdevfops->owner = adap->module;
500
-
501532 list_add_tail (&dvbdev->list_head, &adap->device_list);
502
-
503533 down_write(&minor_rwsem);
504534 #ifdef CONFIG_DVB_DYNAMIC_MINORS
505535 for (minor = 0; minor < MAX_DVB_MINORS; minor++)
506536 if (dvb_minors[minor] == NULL)
507537 break;
508
-
509538 if (minor == MAX_DVB_MINORS) {
510
- kfree(dvbdevfops);
539
+ if (new_node) {
540
+ list_del (&new_node->list_head);
541
+ kfree(dvbdevfops);
542
+ kfree(new_node);
543
+ }
544
+ list_del (&dvbdev->list_head);
511545 kfree(dvbdev);
512546 up_write(&minor_rwsem);
513547 mutex_unlock(&dvbdev_register_lock);
....@@ -516,25 +550,24 @@
516550 #else
517551 minor = nums2minor(adap->num, type, id);
518552 #endif
519
-
520553 dvbdev->minor = minor;
521
- dvb_minors[minor] = dvbdev;
554
+ dvb_minors[minor] = dvb_device_get(dvbdev);
522555 up_write(&minor_rwsem);
523
-
524556 ret = dvb_register_media_device(dvbdev, type, minor, demux_sink_pads);
525557 if (ret) {
526558 pr_err("%s: dvb_register_media_device failed to create the mediagraph\n",
527559 __func__);
528
-
560
+ if (new_node) {
561
+ list_del (&new_node->list_head);
562
+ kfree(dvbdevfops);
563
+ kfree(new_node);
564
+ }
529565 dvb_media_device_free(dvbdev);
530
- kfree(dvbdevfops);
566
+ list_del (&dvbdev->list_head);
531567 kfree(dvbdev);
532
- up_write(&minor_rwsem);
533568 mutex_unlock(&dvbdev_register_lock);
534569 return ret;
535570 }
536
-
537
- mutex_unlock(&dvbdev_register_lock);
538571
539572 clsdev = device_create(dvb_class, adap->device,
540573 MKDEV(DVB_MAJOR, minor),
....@@ -542,11 +575,22 @@
542575 if (IS_ERR(clsdev)) {
543576 pr_err("%s: failed to create device dvb%d.%s%d (%ld)\n",
544577 __func__, adap->num, dnames[type], id, PTR_ERR(clsdev));
578
+ if (new_node) {
579
+ list_del (&new_node->list_head);
580
+ kfree(dvbdevfops);
581
+ kfree(new_node);
582
+ }
583
+ dvb_media_device_free(dvbdev);
584
+ list_del (&dvbdev->list_head);
585
+ kfree(dvbdev);
586
+ mutex_unlock(&dvbdev_register_lock);
545587 return PTR_ERR(clsdev);
546588 }
589
+
547590 dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
548591 adap->num, dnames[type], id, minor, minor);
549592
593
+ mutex_unlock(&dvbdev_register_lock);
550594 return 0;
551595 }
552596 EXPORT_SYMBOL(dvb_register_device);
....@@ -559,6 +603,7 @@
559603
560604 down_write(&minor_rwsem);
561605 dvb_minors[dvbdev->minor] = NULL;
606
+ dvb_device_put(dvbdev);
562607 up_write(&minor_rwsem);
563608
564609 dvb_media_device_free(dvbdev);
....@@ -570,21 +615,33 @@
570615 EXPORT_SYMBOL(dvb_remove_device);
571616
572617
573
-void dvb_free_device(struct dvb_device *dvbdev)
618
+static void dvb_free_device(struct kref *ref)
574619 {
575
- if (!dvbdev)
576
- return;
620
+ struct dvb_device *dvbdev = container_of(ref, struct dvb_device, ref);
577621
578
- kfree (dvbdev->fops);
579622 kfree (dvbdev);
580623 }
581
-EXPORT_SYMBOL(dvb_free_device);
624
+
625
+
626
+struct dvb_device *dvb_device_get(struct dvb_device *dvbdev)
627
+{
628
+ kref_get(&dvbdev->ref);
629
+ return dvbdev;
630
+}
631
+EXPORT_SYMBOL(dvb_device_get);
632
+
633
+
634
+void dvb_device_put(struct dvb_device *dvbdev)
635
+{
636
+ if (dvbdev)
637
+ kref_put(&dvbdev->ref, dvb_free_device);
638
+}
582639
583640
584641 void dvb_unregister_device(struct dvb_device *dvbdev)
585642 {
586643 dvb_remove_device(dvbdev);
587
- dvb_free_device(dvbdev);
644
+ dvb_device_put(dvbdev);
588645 }
589646 EXPORT_SYMBOL(dvb_unregister_device);
590647
....@@ -624,7 +681,7 @@
624681 unsigned demux_pad = 0;
625682 unsigned dvr_pad = 0;
626683 unsigned ntuner = 0, ndemod = 0;
627
- int ret;
684
+ int ret, pad_source, pad_sink;
628685 static const char *connector_name = "Television";
629686
630687 if (!mdev)
....@@ -684,7 +741,7 @@
684741 if (ret)
685742 return ret;
686743
687
- if (!ntuner)
744
+ if (!ntuner) {
688745 ret = media_create_pad_links(mdev,
689746 MEDIA_ENT_F_CONN_RF,
690747 conn, 0,
....@@ -692,22 +749,32 @@
692749 demod, 0,
693750 MEDIA_LNK_FL_ENABLED,
694751 false);
695
- else
752
+ } else {
753
+ pad_sink = media_get_pad_index(tuner, true,
754
+ PAD_SIGNAL_ANALOG);
755
+ if (pad_sink < 0)
756
+ return -EINVAL;
696757 ret = media_create_pad_links(mdev,
697758 MEDIA_ENT_F_CONN_RF,
698759 conn, 0,
699760 MEDIA_ENT_F_TUNER,
700
- tuner, TUNER_PAD_RF_INPUT,
761
+ tuner, pad_sink,
701762 MEDIA_LNK_FL_ENABLED,
702763 false);
764
+ }
703765 if (ret)
704766 return ret;
705767 }
706768
707769 if (ntuner && ndemod) {
770
+ /* NOTE: first found tuner source pad presumed correct */
771
+ pad_source = media_get_pad_index(tuner, false,
772
+ PAD_SIGNAL_ANALOG);
773
+ if (pad_source < 0)
774
+ return -EINVAL;
708775 ret = media_create_pad_links(mdev,
709776 MEDIA_ENT_F_TUNER,
710
- tuner, TUNER_PAD_OUTPUT,
777
+ tuner, pad_source,
711778 MEDIA_ENT_F_DTV_DEMOD,
712779 demod, 0, MEDIA_LNK_FL_ENABLED,
713780 false);
....@@ -892,7 +959,7 @@
892959
893960 /* if the miracle happens and "generic_usercopy()" is included into
894961 the kernel, then this can vanish. please don't make the mistake and
895
- define this as video_usercopy(). this will introduce a dependecy
962
+ define this as video_usercopy(). this will introduce a dependency
896963 to the v4l "videodev.o" module, which is unnecessary for some
897964 cards (ie. the budget dvb-cards don't need the v4l module...) */
898965 int dvb_usercopy(struct file *file,
....@@ -970,15 +1037,15 @@
9701037 return NULL;
9711038
9721039 if (name)
973
- strlcpy(board_info->type, name, I2C_NAME_SIZE);
1040
+ strscpy(board_info->type, name, I2C_NAME_SIZE);
9741041 else
975
- strlcpy(board_info->type, module_name, I2C_NAME_SIZE);
1042
+ strscpy(board_info->type, module_name, I2C_NAME_SIZE);
9761043
9771044 board_info->addr = addr;
9781045 board_info->platform_data = platform_data;
9791046 request_module(module_name);
980
- client = i2c_new_device(adap, board_info);
981
- if (client == NULL || client->dev.driver == NULL) {
1047
+ client = i2c_new_client_device(adap, board_info);
1048
+ if (!i2c_client_has_driver(client)) {
9821049 kfree(board_info);
9831050 return NULL;
9841051 }
....@@ -1057,9 +1124,17 @@
10571124
10581125 static void __exit exit_dvbdev(void)
10591126 {
1127
+ struct dvbdevfops_node *node, *next;
1128
+
10601129 class_destroy(dvb_class);
10611130 cdev_del(&dvb_device_cdev);
10621131 unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS);
1132
+
1133
+ list_for_each_entry_safe(node, next, &dvbdevfops_list, list_head) {
1134
+ list_del (&node->list_head);
1135
+ kfree(node->fops);
1136
+ kfree(node);
1137
+ }
10631138 }
10641139
10651140 subsys_initcall(init_dvbdev);