hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/media/dvb-core/dvb_frontend.c
....@@ -135,7 +135,7 @@
135135 struct dvb_frontend_private *fepriv = fe->frontend_priv;
136136
137137 if (fepriv)
138
- dvb_free_device(fepriv->dvbdev);
138
+ dvb_device_put(fepriv->dvbdev);
139139
140140 dvb_frontend_invoke_release(fe, fe->ops.release);
141141
....@@ -292,14 +292,22 @@
292292 }
293293
294294 if (events->eventw == events->eventr) {
295
- int ret;
295
+ struct wait_queue_entry wait;
296
+ int ret = 0;
296297
297298 if (flags & O_NONBLOCK)
298299 return -EWOULDBLOCK;
299300
300
- ret = wait_event_interruptible(events->wait_queue,
301
- dvb_frontend_test_event(fepriv, events));
302
-
301
+ init_waitqueue_entry(&wait, current);
302
+ add_wait_queue(&events->wait_queue, &wait);
303
+ while (!dvb_frontend_test_event(fepriv, events)) {
304
+ wait_woken(&wait, TASK_INTERRUPTIBLE, 0);
305
+ if (signal_pending(current)) {
306
+ ret = -ERESTARTSYS;
307
+ break;
308
+ }
309
+ }
310
+ remove_wait_queue(&events->wait_queue, &wait);
303311 if (ret < 0)
304312 return ret;
305313 }
....@@ -2961,6 +2969,7 @@
29612969 .name = fe->ops.info.name,
29622970 #endif
29632971 };
2972
+ int ret;
29642973
29652974 dev_dbg(dvb->device, "%s:\n", __func__);
29662975
....@@ -2994,8 +3003,13 @@
29943003 "DVB: registering adapter %i frontend %i (%s)...\n",
29953004 fe->dvb->num, fe->id, fe->ops.info.name);
29963005
2997
- dvb_register_device(fe->dvb, &fepriv->dvbdev, &dvbdev_template,
3006
+ ret = dvb_register_device(fe->dvb, &fepriv->dvbdev, &dvbdev_template,
29983007 fe, DVB_DEVICE_FRONTEND, 0);
3008
+ if (ret) {
3009
+ dvb_frontend_put(fe);
3010
+ mutex_unlock(&frontend_mutex);
3011
+ return ret;
3012
+ }
29993013
30003014 /*
30013015 * Initialize the cache to the proper values according with the