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
1 changed files with 15 additions and 1 deletions
|
@ -61,22 +61,36 @@ static int mcb_probe(struct device *dev)
|
|||
struct mcb_driver *mdrv = to_mcb_driver(dev->driver);
|
||||
struct mcb_device *mdev = to_mcb_device(dev);
|
||||
const struct mcb_device_id *found_id;
|
||||
struct module *carrier_mod;
|
||||
int ret;
|
||||
|
||||
found_id = mcb_match_id(mdrv->id_table, mdev);
|
||||
if (!found_id)
|
||||
return -ENODEV;
|
||||
|
||||
carrier_mod = mdev->dev.parent->driver->owner;
|
||||
if (!try_module_get(carrier_mod))
|
||||
return -EINVAL;
|
||||
|
||||
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)
|
||||
{
|
||||
struct mcb_driver *mdrv = to_mcb_driver(dev->driver);
|
||||
struct mcb_device *mdev = to_mcb_device(dev);
|
||||
struct module *carrier_mod;
|
||||
|
||||
mdrv->remove(mdev);
|
||||
|
||||
carrier_mod = mdev->dev.parent->driver->owner;
|
||||
module_put(carrier_mod);
|
||||
|
||||
put_device(&mdev->dev);
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Reference in a new issue