V4L/DVB (7687): pvrusb2: Fix oops in pvrusb2-dvb
authorMike Isely <isely@pobox.com>
Wed, 6 Feb 2008 07:24:51 +0000 (04:24 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Thu, 24 Apr 2008 17:09:46 +0000 (14:09 -0300)
The pvrusb2-dvb feed thread cannot be allowed to exit by itself
without first waiting for kthread_should_stop() to return true.
Otherwise the driver will have a dangling task_struct context, which
will cause a very nasty kernel oops.

Signed-off-by: Mike Isely <isely@pobox.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/video/pvrusb2/pvrusb2-dvb.c

index 69ac59aa654cf408aff00744521f3d32845b9245..dd693a1980e808e3147fc02af23c8c901e176c58 100644 (file)
@@ -138,9 +138,8 @@ static void pvr2_dvb_fh_done(struct pvr2_dvb_fh *fh)
        pvr2_channel_done(&fh->channel);
 }
 
-static int pvr2_dvb_feed_thread(void *data)
+static int pvr2_dvb_feed_func(struct pvr2_dvb_adapter *adap)
 {
-       struct pvr2_dvb_adapter *adap = data;
        struct pvr2_dvb_fh fh;
        int ret;
        unsigned int count;
@@ -203,12 +202,18 @@ static int pvr2_dvb_feed_thread(void *data)
 
        printk(KERN_DEBUG "dvb thread stopped\n");
 
+       return 0;
+}
+
+static int pvr2_dvb_feed_thread(void *data)
+{
+       int stat = pvr2_dvb_feed_func(data);
        /* from videobuf-dvb.c: */
        while (!kthread_should_stop()) {
                set_current_state(TASK_INTERRUPTIBLE);
                schedule();
        }
-       return 0;
+       return stat;
 }
 
 static int pvr2_dvb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)