V4L/DVB (5512): Fix 3/3 for bug 7819: fixed hotplugging for dvbnet

fixed hotplugging for dvbnet

Signed-off-by: Michal CIJOML Semler <cijoml@volny.cz>
Signed-off-by: Markus Rechberger <markus.rechberger@amd.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
Markus Rechberger 2007-04-14 10:19:36 -03:00 committed by Mauro Carvalho Chehab
parent 57861b432b
commit 2c4d336468
4 changed files with 32 additions and 4 deletions

View File

@ -1208,8 +1208,6 @@ int dvb_dmx_init(struct dvb_demux *dvbdemux)
dmx->disconnect_frontend = dvbdmx_disconnect_frontend; dmx->disconnect_frontend = dvbdmx_disconnect_frontend;
dmx->get_pes_pids = dvbdmx_get_pes_pids; dmx->get_pes_pids = dvbdmx_get_pes_pids;
init_waitqueue_head (&dvbdemux->wait_queue);
mutex_init(&dvbdemux->mutex); mutex_init(&dvbdemux->mutex);
spin_lock_init(&dvbdemux->lock); spin_lock_init(&dvbdemux->lock);

View File

@ -119,7 +119,6 @@ struct dvb_demux {
u16 pids[DMX_TS_PES_OTHER]; u16 pids[DMX_TS_PES_OTHER];
int playing; int playing;
int recording; int recording;
wait_queue_head_t wait_queue;
#define DMX_MAX_PID 0x2000 #define DMX_MAX_PID 0x2000
struct list_head feed_list; struct list_head feed_list;

View File

@ -1439,11 +1439,36 @@ static int dvb_net_ioctl(struct inode *inode, struct file *file,
return dvb_usercopy(inode, file, cmd, arg, dvb_net_do_ioctl); return dvb_usercopy(inode, file, cmd, arg, dvb_net_do_ioctl);
} }
static int dvb_net_close(struct inode *inode, struct file *file)
{
struct dvb_device *dvbdev = file->private_data;
struct dvb_net *dvbnet = dvbdev->priv;
if (!dvbdev)
return -ENODEV;
if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
dvbdev->readers++;
} else {
dvbdev->writers++;
}
dvbdev->users++;
if(dvbdev->users == 1 && dvbnet->exit==1) {
fops_put(file->f_op);
file->f_op = NULL;
wake_up(&dvbdev->wait_queue);
}
return 0;
}
static struct file_operations dvb_net_fops = { static struct file_operations dvb_net_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.ioctl = dvb_net_ioctl, .ioctl = dvb_net_ioctl,
.open = dvb_generic_open, .open = dvb_generic_open,
.release = dvb_generic_release, .release = dvb_net_close,
}; };
static struct dvb_device dvbdev_net = { static struct dvb_device dvbdev_net = {
@ -1458,6 +1483,11 @@ void dvb_net_release (struct dvb_net *dvbnet)
{ {
int i; int i;
dvbnet->exit = 1;
if (dvbnet->dvbdev->users < 1)
wait_event(dvbnet->dvbdev->wait_queue,
dvbnet->dvbdev->users==1);
dvb_unregister_device(dvbnet->dvbdev); dvb_unregister_device(dvbnet->dvbdev);
for (i=0; i<DVB_NET_DEVICES_MAX; i++) { for (i=0; i<DVB_NET_DEVICES_MAX; i++) {

View File

@ -36,6 +36,7 @@ struct dvb_net {
struct dvb_device *dvbdev; struct dvb_device *dvbdev;
struct net_device *device[DVB_NET_DEVICES_MAX]; struct net_device *device[DVB_NET_DEVICES_MAX];
int state[DVB_NET_DEVICES_MAX]; int state[DVB_NET_DEVICES_MAX];
unsigned int exit:1;
struct dmx_demux *demux; struct dmx_demux *demux;
}; };