diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c index a05aa271a1b..c3bb114b89d 100644 --- a/drivers/media/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb-core/dvb_frontend.c @@ -2911,6 +2911,7 @@ static int dvb_frontend_release(struct inode *inode, struct file *file) mb(); } + dvb_device_get(dvbdev); ret = dvb_generic_release(inode, file); if (dvbdev->users == -1) { @@ -2931,6 +2932,7 @@ static int dvb_frontend_release(struct inode *inode, struct file *file) fe->ops.ts_bus_ctrl(fe, 0); } + dvb_device_put(dvbdev); dvb_frontend_put(fe); return ret; diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c index 8b980d371a4..00674bab6e4 100644 --- a/drivers/media/dvb-core/dvbdev.c +++ b/drivers/media/dvb-core/dvbdev.c @@ -96,14 +96,16 @@ static int dvb_device_open(struct inode *inode, struct file *file) dvbdev = dvb_minors[minor]; - if (dvbdev && dvbdev->fops) { + if (dvbdev && kref_get_unless_zero(&dvbdev->ref)) { int err = 0; const struct file_operations *new_fops; new_fops = fops_get(dvbdev->fops); - if (!new_fops) + if (!new_fops) { + dvb_device_put(dvbdev); goto fail; - file->private_data = dvb_device_get(dvbdev); + } + file->private_data = dvbdev; replace_fops(file, new_fops); if (file->f_op->open) err = file->f_op->open(inode, file);