aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMike Isely <isely@pobox.com>2008-02-06 02:24:51 -0500
committerMauro Carvalho Chehab <mchehab@infradead.org>2008-04-24 13:09:46 -0400
commitceb4340deb9bf5f8371d47ef906a83e6784345b0 (patch)
tree10e9e3e24d59c86783fde652beb24ffdb9211e31 /drivers
parente2780fb41102f9844ae6182c03908f03c3cb9163 (diff)
V4L/DVB (7687): pvrusb2: Fix oops in pvrusb2-dvb
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/pvrusb2/pvrusb2-dvb.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/media/video/pvrusb2/pvrusb2-dvb.c b/drivers/media/video/pvrusb2/pvrusb2-dvb.c
index 69ac59aa654c..dd693a1980e8 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-dvb.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-dvb.c
@@ -138,9 +138,8 @@ static void pvr2_dvb_fh_done(struct pvr2_dvb_fh *fh)
138 pvr2_channel_done(&fh->channel); 138 pvr2_channel_done(&fh->channel);
139} 139}
140 140
141static int pvr2_dvb_feed_thread(void *data) 141static int pvr2_dvb_feed_func(struct pvr2_dvb_adapter *adap)
142{ 142{
143 struct pvr2_dvb_adapter *adap = data;
144 struct pvr2_dvb_fh fh; 143 struct pvr2_dvb_fh fh;
145 int ret; 144 int ret;
146 unsigned int count; 145 unsigned int count;
@@ -203,12 +202,18 @@ static int pvr2_dvb_feed_thread(void *data)
203 202
204 printk(KERN_DEBUG "dvb thread stopped\n"); 203 printk(KERN_DEBUG "dvb thread stopped\n");
205 204
205 return 0;
206}
207
208static int pvr2_dvb_feed_thread(void *data)
209{
210 int stat = pvr2_dvb_feed_func(data);
206 /* from videobuf-dvb.c: */ 211 /* from videobuf-dvb.c: */
207 while (!kthread_should_stop()) { 212 while (!kthread_should_stop()) {
208 set_current_state(TASK_INTERRUPTIBLE); 213 set_current_state(TASK_INTERRUPTIBLE);
209 schedule(); 214 schedule();
210 } 215 }
211 return 0; 216 return stat;
212} 217}
213 218
214static int pvr2_dvb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff) 219static int pvr2_dvb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)