Hello Sebastian,

Thank you for the patches. By no means am I questioning your work;
I have a question, though. Please see inline.

On Wednesday, October 17, 2012 9:07 PM Sebastian Andrzej Siewior wrote:

<snip>

> +static struct usb_function *try_get_usb_function(const char *name)
> +{
> +     struct usb_d_function *f;
> +     struct usb_function *uf;
> +
> +     mutex_lock(&func_lock);
> +     list_for_each_entry(f, &func_list, list) {
> +             if (!strcmp(name, f->name)) {
> +                     bool ok;
> +                     ok = try_module_get(f->mod);

Suppose this executes fine; module refcount is increased.

> +                     uf = ERR_PTR(-EBUSY);
> +                     if (!ok)
> +                             goto out;
> +                     uf = f->alloc();

But then suppose this failed

<snip>

> +
> +struct usb_function *usb_get_function(const char *name)
> +{
> +     struct usb_function *uf;
> +     int ret;
> +
> +     uf = try_get_usb_function(name);
> +     if (!IS_ERR(uf))
> +             return uf;
> +     ret = PTR_ERR(uf);
> +     if (ret != -ENOENT)
> +             return uf;
> +     ret = request_module("usbfunc:%s", name);
> +     if (ret < 0)
> +             return ERR_PTR(ret);
> +     return try_get_usb_function(name);
> +}
> +EXPORT_SYMBOL_GPL(usb_get_function);

and, in consequence, usb_get_function returns -ENOMEM.
Which is the hint to the caller that there is no need to call
usb_put_function. And so the module refcount remains increased.

Even if the caller did call usb_put_function, the uf->mod
is not set anyway, so module_put() is not called.

Am I missing something?

Thanks,

AP


--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to