Re: [PATCH 2/3] ipack: save carrier owner to allow device to get it

From: Samuel Iglesias Gonsálvez
Date: Wed Sep 03 2014 - 03:53:40 EST



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 <federico.vaga@xxxxxxx>
> ---
> 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 <siglesias@xxxxxxxxxx>

Sam

Attachment: signature.asc
Description: This is a digitally signed message part