diff --git a/drivers/media/dvb-core/dvb_ca_en50221.c b/drivers/media/dvb-core/dvb_ca_en50221.c index 1b91ebb8f667..626fb7832cea 100644 --- a/drivers/media/dvb-core/dvb_ca_en50221.c +++ b/drivers/media/dvb-core/dvb_ca_en50221.c @@ -1796,6 +1796,8 @@ static int dvb_ca_en50221_io_release(struct inode *inode, struct file *file) mutex_unlock(&ca->remove_mutex); } + dvb_device_put(dvbdev); + return err; } diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c index d082b6c57c76..002ae7b5a91e 100644 --- a/drivers/media/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb-core/dvb_frontend.c @@ -2932,6 +2932,7 @@ static int dvb_frontend_release(struct inode *inode, struct file *file) } dvb_frontend_put(fe); + dvb_device_put(dvbdev); return ret; } diff --git a/drivers/media/dvb-core/dvb_net.c b/drivers/media/dvb-core/dvb_net.c index a2159b2bc176..ad9333adc2ec 100644 --- a/drivers/media/dvb-core/dvb_net.c +++ b/drivers/media/dvb-core/dvb_net.c @@ -1604,6 +1604,8 @@ static int dvb_net_close(struct inode *inode, struct file *file) mutex_unlock(&dvbnet->remove_mutex); } + dvb_device_put(dvbdev); + return 0; } diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c index d753d329502a..a58ce75fdec1 100644 --- a/drivers/media/dvb-core/dvbdev.c +++ b/drivers/media/dvb-core/dvbdev.c @@ -166,8 +166,6 @@ int dvb_generic_release(struct inode *inode, struct file *file) dvbdev->users++; - dvb_device_put(dvbdev); - return 0; } EXPORT_SYMBOL(dvb_generic_release); diff --git a/drivers/media/firewire/firedtv-ci.c b/drivers/media/firewire/firedtv-ci.c index e0d57e09dab0..f9b9c5485c16 100644 --- a/drivers/media/firewire/firedtv-ci.c +++ b/drivers/media/firewire/firedtv-ci.c @@ -210,11 +210,20 @@ static __poll_t fdtv_ca_io_poll(struct file *file, poll_table *wait) return EPOLLIN; } +static int fdtv_ca_fops_release(struct inode *inode, struct file *file) +{ + struct dvb_device *dvbdev = file->private_data; + + dvb_generic_release(inode, file); + dvb_device_put(dvbdev); + return 0; +} + static const struct file_operations fdtv_ca_fops = { .owner = THIS_MODULE, .unlocked_ioctl = dvb_generic_ioctl, .open = dvb_generic_open, - .release = dvb_generic_release, + .release = fdtv_ca_fops_release, .poll = fdtv_ca_io_poll, .llseek = noop_llseek, }; diff --git a/drivers/media/pci/ddbridge/ddbridge-core.c b/drivers/media/pci/ddbridge/ddbridge-core.c index 40e6c873c36d..ca559f19fdae 100644 --- a/drivers/media/pci/ddbridge/ddbridge-core.c +++ b/drivers/media/pci/ddbridge/ddbridge-core.c @@ -799,7 +799,9 @@ static int ts_release(struct inode *inode, struct file *file) return -EINVAL; ddb_output_stop(output); } - return dvb_generic_release(inode, file); + dvb_generic_release(inode, file); + dvb_device_put(dvbdev); + return 0; } static int ts_open(struct inode *inode, struct file *file) diff --git a/drivers/media/pci/ngene/ngene-dvb.c b/drivers/media/pci/ngene/ngene-dvb.c index fda24ba3dc3c..79bff5167824 100644 --- a/drivers/media/pci/ngene/ngene-dvb.c +++ b/drivers/media/pci/ngene/ngene-dvb.c @@ -94,12 +94,21 @@ static __poll_t ts_poll(struct file *file, poll_table *wait) return mask; } +static int ci_release(struct inode *inode, struct file *file) +{ + struct dvb_device *dvbdev = file->private_data; + + dvb_generic_release(inode, file); + dvb_device_put(dvbdev); + return 0; +} + static const struct file_operations ci_fops = { .owner = THIS_MODULE, .read = ts_read, .write = ts_write, .open = dvb_generic_open, - .release = dvb_generic_release, + .release = ci_release, .poll = ts_poll, .mmap = NULL, };