media: don't drop front-end reference count for ->detach
A bugfix introduce a link failure in configurations without CONFIG_MODULES: In file included from drivers/media/usb/dvb-usb/pctv452e.c:20:0: drivers/media/usb/dvb-usb/pctv452e.c: In function 'pctv452e_frontend_attach': drivers/media/dvb-frontends/stb0899_drv.h:151:36: error: weak declaration of 'stb0899_attach' being applied to a already existing, static definition The problem is that the !IS_REACHABLE() declaration of stb0899_attach() is a 'static inline' definition that clashes with the weak definition. I further observed that the bugfix was only done for one of the five users of stb0899_attach(), the other four still have the problem. This reverts the bugfix and instead addresses the problem by not dropping the reference count when calling '->detach()', instead we call this function directly in dvb_frontend_put() before dropping the kref on the front-end. I first submitted this in early 2018, and after some discussion it was apparently discarded. While there is a long-term plan in place, that plan is obviously not nearing completion yet, and the current kernel is still broken unless this patch is applied. Link: https://patchwork.kernel.org/patch/10140175/ Link: https://patchwork.linuxtv.org/patch/54831/ Cc: Max Kellermann <max.kellermann@gmail.com> Cc: Wolfgang Rohdewald <wolfgang@rohdewald.de> Cc: stable@vger.kernel.org Fixes:f686c14364
("[media] stb0899: move code to "detach" callback") Fixes:6cdeaed3b1
("media: dvb_usb_pctv452e: module refcount changes were unbalanced") Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Sean Young <sean@mess.org> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
4590c07462
commit
14e3cdbb00
|
@ -152,6 +152,9 @@ static void dvb_frontend_free(struct kref *ref)
|
|||
|
||||
static void dvb_frontend_put(struct dvb_frontend *fe)
|
||||
{
|
||||
/* call detach before dropping the reference count */
|
||||
if (fe->ops.detach)
|
||||
fe->ops.detach(fe);
|
||||
/*
|
||||
* Check if the frontend was registered, as otherwise
|
||||
* kref was not initialized yet.
|
||||
|
@ -3040,7 +3043,6 @@ void dvb_frontend_detach(struct dvb_frontend *fe)
|
|||
dvb_frontend_invoke_release(fe, fe->ops.release_sec);
|
||||
dvb_frontend_invoke_release(fe, fe->ops.tuner_ops.release);
|
||||
dvb_frontend_invoke_release(fe, fe->ops.analog_ops.release);
|
||||
dvb_frontend_invoke_release(fe, fe->ops.detach);
|
||||
dvb_frontend_put(fe);
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_frontend_detach);
|
||||
|
|
|
@ -909,14 +909,6 @@ static int pctv452e_frontend_attach(struct dvb_usb_adapter *a)
|
|||
&a->dev->i2c_adap);
|
||||
if (!a->fe_adap[0].fe)
|
||||
return -ENODEV;
|
||||
|
||||
/*
|
||||
* dvb_frontend will call dvb_detach for both stb0899_detach
|
||||
* and stb0899_release but we only do dvb_attach(stb0899_attach).
|
||||
* Increment the module refcount instead.
|
||||
*/
|
||||
symbol_get(stb0899_attach);
|
||||
|
||||
if ((dvb_attach(lnbp22_attach, a->fe_adap[0].fe,
|
||||
&a->dev->i2c_adap)) == NULL)
|
||||
err("Cannot attach lnbp22\n");
|
||||
|
|
Loading…
Reference in New Issue