Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=2c4d336468b400f9a47d6c1785d230548b89ca24
Commit:     2c4d336468b400f9a47d6c1785d230548b89ca24
Parent:     57861b432bda77f8bfafda2fb6f5a922d5f3aef1
Author:     Markus Rechberger <[EMAIL PROTECTED]>
AuthorDate: Sat Apr 14 10:19:36 2007 -0300
Committer:  Mauro Carvalho Chehab <[EMAIL PROTECTED]>
CommitDate: Fri Apr 27 15:45:32 2007 -0300

    V4L/DVB (5512): Fix 3/3 for bug 7819: fixed hotplugging for dvbnet
    
    fixed hotplugging for dvbnet
    
    Signed-off-by: Michal CIJOML Semler <[EMAIL PROTECTED]>
    Signed-off-by: Markus Rechberger <[EMAIL PROTECTED]>
    Signed-off-by: Mauro Carvalho Chehab <[EMAIL PROTECTED]>
---
 drivers/media/dvb/dvb-core/dvb_demux.c |    2 --
 drivers/media/dvb/dvb-core/dvb_demux.h |    1 -
 drivers/media/dvb/dvb-core/dvb_net.c   |   32 +++++++++++++++++++++++++++++++-
 drivers/media/dvb/dvb-core/dvb_net.h   |    1 +
 4 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/drivers/media/dvb/dvb-core/dvb_demux.c 
b/drivers/media/dvb/dvb-core/dvb_demux.c
index f558ac9..6d8d1c3 100644
--- a/drivers/media/dvb/dvb-core/dvb_demux.c
+++ b/drivers/media/dvb/dvb-core/dvb_demux.c
@@ -1208,8 +1208,6 @@ int dvb_dmx_init(struct dvb_demux *dvbdemux)
        dmx->disconnect_frontend = dvbdmx_disconnect_frontend;
        dmx->get_pes_pids = dvbdmx_get_pes_pids;
 
-       init_waitqueue_head (&dvbdemux->wait_queue);
-
        mutex_init(&dvbdemux->mutex);
        spin_lock_init(&dvbdemux->lock);
 
diff --git a/drivers/media/dvb/dvb-core/dvb_demux.h 
b/drivers/media/dvb/dvb-core/dvb_demux.h
index e1e9139..2c5f915 100644
--- a/drivers/media/dvb/dvb-core/dvb_demux.h
+++ b/drivers/media/dvb/dvb-core/dvb_demux.h
@@ -119,7 +119,6 @@ struct dvb_demux {
        u16 pids[DMX_TS_PES_OTHER];
        int playing;
        int recording;
-       wait_queue_head_t         wait_queue;
 
 #define DMX_MAX_PID 0x2000
        struct list_head feed_list;
diff --git a/drivers/media/dvb/dvb-core/dvb_net.c 
b/drivers/media/dvb/dvb-core/dvb_net.c
index 6a5ab40..4ebf33a 100644
--- a/drivers/media/dvb/dvb-core/dvb_net.c
+++ b/drivers/media/dvb/dvb-core/dvb_net.c
@@ -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);
 }
 
+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 = {
        .owner = THIS_MODULE,
        .ioctl = dvb_net_ioctl,
        .open = dvb_generic_open,
-       .release = dvb_generic_release,
+       .release = dvb_net_close,
 };
 
 static struct dvb_device dvbdev_net = {
@@ -1458,6 +1483,11 @@ void dvb_net_release (struct dvb_net *dvbnet)
 {
        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);
 
        for (i=0; i<DVB_NET_DEVICES_MAX; i++) {
diff --git a/drivers/media/dvb/dvb-core/dvb_net.h 
b/drivers/media/dvb/dvb-core/dvb_net.h
index f14e4ca..3a3126c 100644
--- a/drivers/media/dvb/dvb-core/dvb_net.h
+++ b/drivers/media/dvb/dvb-core/dvb_net.h
@@ -36,6 +36,7 @@ struct dvb_net {
        struct dvb_device *dvbdev;
        struct net_device *device[DVB_NET_DEVICES_MAX];
        int state[DVB_NET_DEVICES_MAX];
+       unsigned int exit:1;
        struct dmx_demux *demux;
 };
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to