48 lines
1.8 KiB
Diff
48 lines
1.8 KiB
Diff
From: Daniel Scheller <d.scheller@gmx.net>
|
|
Date: Sun, 29 Oct 2017 11:43:22 -0400
|
|
Subject: media: dvb-core: always call invoke_release() in fe_free()
|
|
Origin: https://git.kernel.org/linus/62229de19ff2b7f3e0ebf4d48ad99061127d0281
|
|
|
|
Follow-up to: ead666000a5f ("media: dvb_frontend: only use kref after initialized")
|
|
|
|
The aforementioned commit fixed refcount OOPSes when demod driver attaching
|
|
succeeded but tuner driver didn't. However, the use count of the attached
|
|
demod drivers don't go back to zero and thus couldn't be cleanly unloaded.
|
|
Improve on this by calling dvb_frontend_invoke_release() in
|
|
__dvb_frontend_free() regardless of fepriv being NULL, instead of returning
|
|
when fepriv is NULL. This is safe to do since _invoke_release() will check
|
|
for passed pointers being valid before calling the .release() function.
|
|
|
|
[mchehab@s-opensource.com: changed the logic a little bit to reduce
|
|
conflicts with another bug fix patch under review]
|
|
Fixes: ead666000a5f ("media: dvb_frontend: only use kref after initialized")
|
|
Signed-off-by: Daniel Scheller <d.scheller@gmx.net>
|
|
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
---
|
|
drivers/media/dvb-core/dvb_frontend.c | 9 +++++----
|
|
1 file changed, 5 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c
|
|
index daaf969719e4..d485d5f6cc88 100644
|
|
--- a/drivers/media/dvb-core/dvb_frontend.c
|
|
+++ b/drivers/media/dvb-core/dvb_frontend.c
|
|
@@ -145,13 +145,14 @@ static void __dvb_frontend_free(struct dvb_frontend *fe)
|
|
{
|
|
struct dvb_frontend_private *fepriv = fe->frontend_priv;
|
|
|
|
- if (!fepriv)
|
|
- return;
|
|
-
|
|
- dvb_free_device(fepriv->dvbdev);
|
|
+ if (fepriv)
|
|
+ dvb_free_device(fepriv->dvbdev);
|
|
|
|
dvb_frontend_invoke_release(fe, fe->ops.release);
|
|
|
|
+ if (!fepriv)
|
|
+ return;
|
|
+
|
|
kfree(fepriv);
|
|
fe->frontend_priv = NULL;
|
|
}
|