diff options
author | Hans de Goede <hdegoede@redhat.com> | 2012-05-19 06:57:03 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-06-11 15:02:54 -0400 |
commit | 5daf53a6eb5c54c618c9def388d81c2769fd11a0 (patch) | |
tree | ae26108d5971c8e9fb7fcc5d9795b12145a1466b /sound | |
parent | 0875eb755b66a6766be117133dbb6d8157ace337 (diff) |
[media] snd_tea575x: Make the module using snd_tea575x the fops owner
Before this patch the owner field of the /dev/radio# device fops was set to
the snd-tea575x-tuner module itself. Meaning that the module which was using
it could be rmmod-ed while the device is open, and then BAD things happen.
I know, as I found out the hard way :)
Note that there is no need to also somehow increase the refcount of the
snd-tea575x-tuner module itself, since any drivers using it will have
symbolic references to it.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
CC: Ondrej Zary <linux@rainbow-software.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/i2c/other/tea575x-tuner.c | 7 | ||||
-rw-r--r-- | sound/pci/es1968.c | 2 | ||||
-rw-r--r-- | sound/pci/fm801.c | 4 |
3 files changed, 7 insertions, 6 deletions
diff --git a/sound/i2c/other/tea575x-tuner.c b/sound/i2c/other/tea575x-tuner.c index aa9900dff6e9..ac62ee791a60 100644 --- a/sound/i2c/other/tea575x-tuner.c +++ b/sound/i2c/other/tea575x-tuner.c | |||
@@ -317,7 +317,6 @@ static int tea575x_s_ctrl(struct v4l2_ctrl *ctrl) | |||
317 | } | 317 | } |
318 | 318 | ||
319 | static const struct v4l2_file_operations tea575x_fops = { | 319 | static const struct v4l2_file_operations tea575x_fops = { |
320 | .owner = THIS_MODULE, | ||
321 | .unlocked_ioctl = video_ioctl2, | 320 | .unlocked_ioctl = video_ioctl2, |
322 | .open = v4l2_fh_open, | 321 | .open = v4l2_fh_open, |
323 | .release = v4l2_fh_release, | 322 | .release = v4l2_fh_release, |
@@ -337,7 +336,6 @@ static const struct v4l2_ioctl_ops tea575x_ioctl_ops = { | |||
337 | }; | 336 | }; |
338 | 337 | ||
339 | static const struct video_device tea575x_radio = { | 338 | static const struct video_device tea575x_radio = { |
340 | .fops = &tea575x_fops, | ||
341 | .ioctl_ops = &tea575x_ioctl_ops, | 339 | .ioctl_ops = &tea575x_ioctl_ops, |
342 | .release = video_device_release_empty, | 340 | .release = video_device_release_empty, |
343 | }; | 341 | }; |
@@ -349,7 +347,7 @@ static const struct v4l2_ctrl_ops tea575x_ctrl_ops = { | |||
349 | /* | 347 | /* |
350 | * initialize all the tea575x chips | 348 | * initialize all the tea575x chips |
351 | */ | 349 | */ |
352 | int snd_tea575x_init(struct snd_tea575x *tea) | 350 | int snd_tea575x_init(struct snd_tea575x *tea, struct module *owner) |
353 | { | 351 | { |
354 | int retval; | 352 | int retval; |
355 | 353 | ||
@@ -374,6 +372,9 @@ int snd_tea575x_init(struct snd_tea575x *tea) | |||
374 | tea->vd.lock = &tea->mutex; | 372 | tea->vd.lock = &tea->mutex; |
375 | tea->vd.v4l2_dev = tea->v4l2_dev; | 373 | tea->vd.v4l2_dev = tea->v4l2_dev; |
376 | tea->vd.ctrl_handler = &tea->ctrl_handler; | 374 | tea->vd.ctrl_handler = &tea->ctrl_handler; |
375 | tea->fops = tea575x_fops; | ||
376 | tea->fops.owner = owner; | ||
377 | tea->vd.fops = &tea->fops; | ||
377 | set_bit(V4L2_FL_USE_FH_PRIO, &tea->vd.flags); | 378 | set_bit(V4L2_FL_USE_FH_PRIO, &tea->vd.flags); |
378 | /* disable hw_freq_seek if we can't use it */ | 379 | /* disable hw_freq_seek if we can't use it */ |
379 | if (tea->cannot_read_data) | 380 | if (tea->cannot_read_data) |
diff --git a/sound/pci/es1968.c b/sound/pci/es1968.c index a8faae1c85e4..0f2811eeeebd 100644 --- a/sound/pci/es1968.c +++ b/sound/pci/es1968.c | |||
@@ -2769,7 +2769,7 @@ static int __devinit snd_es1968_create(struct snd_card *card, | |||
2769 | chip->tea.ops = &snd_es1968_tea_ops; | 2769 | chip->tea.ops = &snd_es1968_tea_ops; |
2770 | strlcpy(chip->tea.card, "SF64-PCE2", sizeof(chip->tea.card)); | 2770 | strlcpy(chip->tea.card, "SF64-PCE2", sizeof(chip->tea.card)); |
2771 | sprintf(chip->tea.bus_info, "PCI:%s", pci_name(pci)); | 2771 | sprintf(chip->tea.bus_info, "PCI:%s", pci_name(pci)); |
2772 | if (!snd_tea575x_init(&chip->tea)) | 2772 | if (!snd_tea575x_init(&chip->tea, THIS_MODULE)) |
2773 | printk(KERN_INFO "es1968: detected TEA575x radio\n"); | 2773 | printk(KERN_INFO "es1968: detected TEA575x radio\n"); |
2774 | #endif | 2774 | #endif |
2775 | 2775 | ||
diff --git a/sound/pci/fm801.c b/sound/pci/fm801.c index a416ea8af3e9..5265c576a26a 100644 --- a/sound/pci/fm801.c +++ b/sound/pci/fm801.c | |||
@@ -1254,7 +1254,7 @@ static int __devinit snd_fm801_create(struct snd_card *card, | |||
1254 | sprintf(chip->tea.bus_info, "PCI:%s", pci_name(pci)); | 1254 | sprintf(chip->tea.bus_info, "PCI:%s", pci_name(pci)); |
1255 | if ((tea575x_tuner & TUNER_TYPE_MASK) > 0 && | 1255 | if ((tea575x_tuner & TUNER_TYPE_MASK) > 0 && |
1256 | (tea575x_tuner & TUNER_TYPE_MASK) < 4) { | 1256 | (tea575x_tuner & TUNER_TYPE_MASK) < 4) { |
1257 | if (snd_tea575x_init(&chip->tea)) { | 1257 | if (snd_tea575x_init(&chip->tea, THIS_MODULE)) { |
1258 | snd_printk(KERN_ERR "TEA575x radio not found\n"); | 1258 | snd_printk(KERN_ERR "TEA575x radio not found\n"); |
1259 | snd_fm801_free(chip); | 1259 | snd_fm801_free(chip); |
1260 | return -ENODEV; | 1260 | return -ENODEV; |
@@ -1263,7 +1263,7 @@ static int __devinit snd_fm801_create(struct snd_card *card, | |||
1263 | /* autodetect tuner connection */ | 1263 | /* autodetect tuner connection */ |
1264 | for (tea575x_tuner = 1; tea575x_tuner <= 3; tea575x_tuner++) { | 1264 | for (tea575x_tuner = 1; tea575x_tuner <= 3; tea575x_tuner++) { |
1265 | chip->tea575x_tuner = tea575x_tuner; | 1265 | chip->tea575x_tuner = tea575x_tuner; |
1266 | if (!snd_tea575x_init(&chip->tea)) { | 1266 | if (!snd_tea575x_init(&chip->tea, THIS_MODULE)) { |
1267 | snd_printk(KERN_INFO "detected TEA575x radio type %s\n", | 1267 | snd_printk(KERN_INFO "detected TEA575x radio type %s\n", |
1268 | get_tea575x_gpio(chip)->name); | 1268 | get_tea575x_gpio(chip)->name); |
1269 | break; | 1269 | break; |