On Tue, 2014-09-02 at 17:31 +0200, Federico Vaga wrote: > There was not any kind of protection against carrier driver removal. > In this way, device driver can 'get' the carrier driver when it is > using it. > > Signed-off-by: Federico Vaga > --- > drivers/ipack/carriers/tpci200.c | 3 ++- > drivers/ipack/ipack.c | 4 +++- > include/linux/ipack.h | 24 +++++++++++++++++++++++- > 3 files changed, 28 insertions(+), 3 deletions(-) > > diff --git a/drivers/ipack/carriers/tpci200.c b/drivers/ipack/carriers/tpci200.c > index de5e321..9b23843 100644 > --- a/drivers/ipack/carriers/tpci200.c > +++ b/drivers/ipack/carriers/tpci200.c > @@ -572,7 +572,8 @@ static int tpci200_pci_probe(struct pci_dev *pdev, > /* Register the carrier in the industry pack bus driver */ > tpci200->info->ipack_bus = ipack_bus_register(&pdev->dev, > TPCI200_NB_SLOT, > - &tpci200_bus_ops); > + &tpci200_bus_ops, > + THIS_MODULE); > if (!tpci200->info->ipack_bus) { > dev_err(&pdev->dev, > "error registering the carrier on ipack driver\n"); > diff --git a/drivers/ipack/ipack.c b/drivers/ipack/ipack.c > index d0016ba..c0e7b62 100644 > --- a/drivers/ipack/ipack.c > +++ b/drivers/ipack/ipack.c > @@ -206,7 +206,8 @@ static struct bus_type ipack_bus_type = { > }; > > struct ipack_bus_device *ipack_bus_register(struct device *parent, int slots, > - const struct ipack_bus_ops *ops) > + const struct ipack_bus_ops *ops, > + struct module *owner) > { > int bus_nr; > struct ipack_bus_device *bus; > @@ -225,6 +226,7 @@ struct ipack_bus_device *ipack_bus_register(struct device *parent, int slots, > bus->parent = parent; > bus->slots = slots; > bus->ops = ops; > + bus->owner = owner; > return bus; > } > EXPORT_SYMBOL_GPL(ipack_bus_register); > diff --git a/include/linux/ipack.h b/include/linux/ipack.h > index 1888e06..8bddc3f 100644 > --- a/include/linux/ipack.h > +++ b/include/linux/ipack.h > @@ -172,6 +172,7 @@ struct ipack_bus_ops { > * @ops: bus operations for the mezzanine drivers > */ > struct ipack_bus_device { > + struct module *owner; > struct device *parent; > int slots; > int bus_nr; > @@ -189,7 +190,8 @@ struct ipack_bus_device { > * available bus device in ipack. > */ > struct ipack_bus_device *ipack_bus_register(struct device *parent, int slots, > - const struct ipack_bus_ops *ops); > + const struct ipack_bus_ops *ops, > + struct module *owner); > > /** > * ipack_bus_unregister -- unregister an ipack bus > @@ -265,3 +267,23 @@ void ipack_put_device(struct ipack_device *dev); > .format = (_format), \ > .vendor = (vend), \ > .device = (dev) > + > +/** > + * ipack_get_carrier - it increase the carrier ref. counter of > + * the carrier module > + * @dev: mezzanine device which wants to get the carrier > + */ > +static inline int ipack_get_carrier(struct ipack_device *dev) > +{ > + return try_module_get(dev->bus->owner); > +} > + > +/** > + * ipack_get_carrier - it decrease the carrier ref. counter of > + * the carrier module > + * @dev: mezzanine device which wants to get the carrier > + */ > +static inline void ipack_put_carrier(struct ipack_device *dev) > +{ > + module_put(dev->bus->owner); > +} Acked-by: Samuel Iglesias Gonsalvez Sam