mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-01 10:45:49 +00:00
mcb: Acquire reference to carrier module in core
Acquire a reference to the carrier's kernel module in bus code, so it can't be removed from the kernel while it still has a bus and thus possibly devices attached to it. Signed-off-by: Johannes Thumshirn <jthumshirn@suse.de> Reported-by: Andreas Werner <andreas.werner@men.de> Tested-by: Andreas Werner <andreas.werner@men.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
7bc364097a
commit
4d2ec85753
@ -61,22 +61,36 @@ static int mcb_probe(struct device *dev)
|
|||||||
struct mcb_driver *mdrv = to_mcb_driver(dev->driver);
|
struct mcb_driver *mdrv = to_mcb_driver(dev->driver);
|
||||||
struct mcb_device *mdev = to_mcb_device(dev);
|
struct mcb_device *mdev = to_mcb_device(dev);
|
||||||
const struct mcb_device_id *found_id;
|
const struct mcb_device_id *found_id;
|
||||||
|
struct module *carrier_mod;
|
||||||
|
int ret;
|
||||||
|
|
||||||
found_id = mcb_match_id(mdrv->id_table, mdev);
|
found_id = mcb_match_id(mdrv->id_table, mdev);
|
||||||
if (!found_id)
|
if (!found_id)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
carrier_mod = mdev->dev.parent->driver->owner;
|
||||||
|
if (!try_module_get(carrier_mod))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
get_device(dev);
|
get_device(dev);
|
||||||
return mdrv->probe(mdev, found_id);
|
ret = mdrv->probe(mdev, found_id);
|
||||||
|
if (ret)
|
||||||
|
module_put(carrier_mod);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mcb_remove(struct device *dev)
|
static int mcb_remove(struct device *dev)
|
||||||
{
|
{
|
||||||
struct mcb_driver *mdrv = to_mcb_driver(dev->driver);
|
struct mcb_driver *mdrv = to_mcb_driver(dev->driver);
|
||||||
struct mcb_device *mdev = to_mcb_device(dev);
|
struct mcb_device *mdev = to_mcb_device(dev);
|
||||||
|
struct module *carrier_mod;
|
||||||
|
|
||||||
mdrv->remove(mdev);
|
mdrv->remove(mdev);
|
||||||
|
|
||||||
|
carrier_mod = mdev->dev.parent->driver->owner;
|
||||||
|
module_put(carrier_mod);
|
||||||
|
|
||||||
put_device(&mdev->dev);
|
put_device(&mdev->dev);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user