diff options
author | Greg Kroah-Hartman | 2017-10-23 14:24:37 +0200 |
---|---|---|
committer | Greg Kroah-Hartman | 2017-10-23 14:24:37 +0200 |
commit | 0520d37bb3d49f8e62e30c80b001e0003b3f3ca9 (patch) | |
tree | decc3a87d59b4eec5ec8c8c9c3f8378c35a29c7b /drivers/media/dvb-core/dvb_frontend.c | |
parent | USB: Force disconnect Huawei 4G modem during suspend (diff) | |
parent | Linux 4.14-rc6 (diff) | |
download | kernel-qcow2-linux-0520d37bb3d49f8e62e30c80b001e0003b3f3ca9.tar.gz kernel-qcow2-linux-0520d37bb3d49f8e62e30c80b001e0003b3f3ca9.tar.xz kernel-qcow2-linux-0520d37bb3d49f8e62e30c80b001e0003b3f3ca9.zip |
Merge 4.14-rc6 into usb-next
We need the USB fixes in here as well.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/media/dvb-core/dvb_frontend.c')
-rw-r--r-- | drivers/media/dvb-core/dvb_frontend.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c index 2fcba1616168..9139d01ba7ed 100644 --- a/drivers/media/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb-core/dvb_frontend.c @@ -141,22 +141,39 @@ struct dvb_frontend_private { static void dvb_frontend_invoke_release(struct dvb_frontend *fe, void (*release)(struct dvb_frontend *fe)); -static void dvb_frontend_free(struct kref *ref) +static void __dvb_frontend_free(struct dvb_frontend *fe) { - struct dvb_frontend *fe = - container_of(ref, struct dvb_frontend, refcount); struct dvb_frontend_private *fepriv = fe->frontend_priv; + if (!fepriv) + return; + dvb_free_device(fepriv->dvbdev); dvb_frontend_invoke_release(fe, fe->ops.release); kfree(fepriv); + fe->frontend_priv = NULL; +} + +static void dvb_frontend_free(struct kref *ref) +{ + struct dvb_frontend *fe = + container_of(ref, struct dvb_frontend, refcount); + + __dvb_frontend_free(fe); } static void dvb_frontend_put(struct dvb_frontend *fe) { - kref_put(&fe->refcount, dvb_frontend_free); + /* + * Check if the frontend was registered, as otherwise + * kref was not initialized yet. + */ + if (fe->frontend_priv) + kref_put(&fe->refcount, dvb_frontend_free); + else + __dvb_frontend_free(fe); } static void dvb_frontend_get(struct dvb_frontend *fe) |