Skip to content

Commit

Permalink
firmware loader: simplify holding module for request_firmware
Browse files Browse the repository at this point in the history
module reference doesn't cover direct loading path, so this patch
simply holds the module in the whole life time of request_firmware()
to fix the problem.

Signed-off-by: Ming Lei <ming.lei@canonical.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Ming Lei authored and Greg Kroah-Hartman committed Jun 6, 2013
1 parent 93232e4 commit d6c8aa3
Showing 1 changed file with 7 additions and 6 deletions.
13 changes: 7 additions & 6 deletions drivers/base/firmware_class.c
Original file line number Diff line number Diff line change
Expand Up @@ -523,8 +523,6 @@ static void fw_dev_release(struct device *dev)
struct firmware_priv *fw_priv = to_firmware_priv(dev);

kfree(fw_priv);

module_put(THIS_MODULE);
}

static int firmware_uevent(struct device *dev, struct kobj_uevent_env *env)
Expand Down Expand Up @@ -852,9 +850,6 @@ static int _request_firmware_load(struct firmware_priv *fw_priv, bool uevent,

dev_set_uevent_suppress(f_dev, true);

/* Need to pin this module until class device is destroyed */
__module_get(THIS_MODULE);

retval = device_add(f_dev);
if (retval) {
dev_err(f_dev, "%s: device_register failed\n", __func__);
Expand Down Expand Up @@ -1131,7 +1126,13 @@ int
request_firmware(const struct firmware **firmware_p, const char *name,
struct device *device)
{
return _request_firmware(firmware_p, name, device, true, false);
int ret;

/* Need to pin this module until return */
__module_get(THIS_MODULE);
ret = _request_firmware(firmware_p, name, device, true, false);
module_put(THIS_MODULE);
return ret;
}
EXPORT_SYMBOL(request_firmware);

Expand Down

0 comments on commit d6c8aa3

Please sign in to comment.