Following patch adds a rather primitive way to temporary lock dvb devicenodes, this can be useful for hybrid devices which use the video4linux framework for the analogue TV part and the dvb framework for digital TV if only one mode can be accessed at a time. Signed-off-by: Markus Rechberger <markus.rechberger@xxxxxxx> http://mcentral.de/~mrec/patches/dvb_device_node_locking.diff (this patch requires [1] which has been posted earlier already to apply properly) [1] http://mcentral.de/~mrec/patches/dvb_net_fixes.diff diff -r 8cab88ff59a1 linux/drivers/media/dvb/dvb-core/dmxdev.c --- a/linux/drivers/media/dvb/dvb-core/dmxdev.c Thu Aug 09 16:14:51 2007 +0200 +++ b/linux/drivers/media/dvb/dvb-core/dmxdev.c Thu Aug 09 16:16:14 2007 +0200 @@ -127,6 +127,9 @@ static int dvb_dvr_open(struct inode *in struct dmxdev *dmxdev = dvbdev->priv; struct dmx_frontend *front; + if (dmxdev->dvb_lock) + return -EBUSY; + dprintk("function : %s\n", __FUNCTION__); if (mutex_lock_interruptible(&dmxdev->mutex)) @@ -665,6 +668,9 @@ static int dvb_demux_open(struct inode * int i; struct dmxdev_filter *dmxdevfilter; + if (dmxdev->dvb_lock) + return -EBUSY; + if (!dmxdev->filter) return -EINVAL; diff -r 8cab88ff59a1 linux/drivers/media/dvb/dvb-core/dmxdev.h --- a/linux/drivers/media/dvb/dvb-core/dmxdev.h Thu Aug 09 16:14:51 2007 +0200 +++ b/linux/drivers/media/dvb/dvb-core/dmxdev.h Thu Aug 09 16:16:46 2007 +0200 @@ -101,6 +101,7 @@ struct dmxdev { unsigned int exit:1; #define DMXDEV_CAP_DUPLEX 1 + unsigned int dvb_lock:1; struct dmx_frontend *dvr_orig_fe; struct dvb_ringbuffer dvr_buffer; diff -r 8cab88ff59a1 linux/drivers/media/dvb/dvb-core/dvb_demux.c --- a/linux/drivers/media/dvb/dvb-core/dvb_demux.c Thu Aug 09 16:14:51 2007 +0200 +++ b/linux/drivers/media/dvb/dvb-core/dvb_demux.c Thu Aug 09 16:17:14 2007 +0200 @@ -1040,6 +1040,9 @@ static int dvbdmx_open(struct dmx_demux { struct dvb_demux *dvbdemux = (struct dvb_demux *)demux; + if (dvbdemux->dvb_lock) + return -EBUSY; + if (dvbdemux->users >= MAX_DVB_DEMUX_USERS) return -EUSERS; diff -r 8cab88ff59a1 linux/drivers/media/dvb/dvb-core/dvb_demux.h --- a/linux/drivers/media/dvb/dvb-core/dvb_demux.h Thu Aug 09 16:14:51 2007 +0200 +++ b/linux/drivers/media/dvb/dvb-core/dvb_demux.h Thu Aug 09 16:17:30 2007 +0200 @@ -128,6 +128,8 @@ struct dvb_demux { u8 tsbuf[204]; int tsbufp; + unsigned int dvb_lock:1; + #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15) struct mutex mutex; #else diff -r 8cab88ff59a1 linux/drivers/media/dvb/dvb-core/dvb_frontend.c --- a/linux/drivers/media/dvb/dvb-core/dvb_frontend.c Thu Aug 09 16:14:51 2007 +0200 +++ b/linux/drivers/media/dvb/dvb-core/dvb_frontend.c Thu Aug 09 16:18:06 2007 +0200 @@ -1060,6 +1060,9 @@ static int dvb_frontend_open(struct inod struct dvb_frontend_private *fepriv = fe->frontend_priv; int ret; + if (fe->dvb_lock) + return -EBUSY; + dprintk ("%s\n", __FUNCTION__); if ((ret = dvb_generic_open (inode, file)) < 0) diff -r 8cab88ff59a1 linux/drivers/media/dvb/dvb-core/dvb_frontend.h --- a/linux/drivers/media/dvb/dvb-core/dvb_frontend.h Thu Aug 09 16:14:51 2007 +0200 +++ b/linux/drivers/media/dvb/dvb-core/dvb_frontend.h Thu Aug 09 16:18:43 2007 +0200 @@ -155,6 +155,7 @@ struct dvb_frontend { struct dvb_frontend { struct dvb_frontend_ops ops; struct dvb_adapter *dvb; + unsigned int dvb_lock:1; void* demodulator_priv; void* tuner_priv; void* frontend_priv; diff -r 8cab88ff59a1 linux/drivers/media/dvb/dvb-core/dvb_net.c --- a/linux/drivers/media/dvb/dvb-core/dvb_net.c Thu Aug 09 16:14:51 2007 +0200 +++ b/linux/drivers/media/dvb/dvb-core/dvb_net.c Thu Aug 09 16:19:24 2007 +0200 @@ -1533,6 +1533,9 @@ static int dvb_net_open_node(struct inod return -ENODEV; dvbnet = dvbdev->priv; + + if (dvbnet->dvb_lock) + return -EBUSY; if (dvbnet->exit) return -ENODEV; diff -r 8cab88ff59a1 linux/drivers/media/dvb/dvb-core/dvb_net.h --- a/linux/drivers/media/dvb/dvb-core/dvb_net.h Thu Aug 09 16:14:51 2007 +0200 +++ b/linux/drivers/media/dvb/dvb-core/dvb_net.h Thu Aug 09 16:19:40 2007 +0200 @@ -37,6 +37,7 @@ struct dvb_net { struct net_device *device[DVB_NET_DEVICES_MAX]; int state[DVB_NET_DEVICES_MAX]; unsigned int exit:1; + unsigned int dvb_lock:1; struct dmx_demux *demux; }; _______________________________________________ linux-dvb mailing list linux-dvb@xxxxxxxxxxx http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb