diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c index d082b6c57c76..497f5920b267 100644 --- a/drivers/media/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb-core/dvb_frontend.c @@ -2887,7 +2887,7 @@ static int dvb_frontend_open(struct inode *inode, struct file *file) mutex_unlock(&fe->dvb->mdev_lock); err2: #endif - dvb_generic_release(inode, file); + __dvb_generic_release(inode, file); err1: if (dvbdev->users == -1 && fe->ops.ts_bus_ctrl) fe->ops.ts_bus_ctrl(fe, 0); diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c index d753d329502a..a332caf15e1f 100644 --- a/drivers/media/dvb-core/dvbdev.c +++ b/drivers/media/dvb-core/dvbdev.c @@ -159,12 +159,7 @@ int dvb_generic_release(struct inode *inode, struct file *file) if (!dvbdev) return -ENODEV; - if ((file->f_flags & O_ACCMODE) == O_RDONLY) - dvbdev->readers++; - else - dvbdev->writers++; - - dvbdev->users++; + __dvb_generic_release(inode, file); dvb_device_put(dvbdev); diff --git a/include/media/dvbdev.h b/include/media/dvbdev.h index e5a00d126612..f8c6cb033000 100644 --- a/include/media/dvbdev.h +++ b/include/media/dvbdev.h @@ -343,6 +343,28 @@ int dvb_create_media_graph(struct dvb_adapter *adap, */ int dvb_generic_open(struct inode *inode, struct file *file); +/* + * __dvb_generic_release - Undo dvb_generic_open() counters WITHOUT + * dropping the device reference. + * + * @inode: pointer to &struct inode. + * @file: pointer to &struct file. + * + * Used in cases where the caller handles dvb_device_put() and ensures + * that dvbdev is valid. + */ +static inline void __dvb_generic_release(struct inode *inode, + struct file *file) +{ + struct dvb_device *dvbdev = file->private_data; + + if ((file->f_flags & O_ACCMODE) == O_RDONLY) + dvbdev->readers++; + else + dvbdev->writers++; + dvbdev->users++; +} + /** * dvb_generic_release - Digital TV close function, used by DVB devices *