|
|
@@ -788,6 +788,7 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
|
|
|
{
|
|
|
struct gendisk *disk;
|
|
|
struct blkcg_gq *blkg;
|
|
|
+ struct module *owner;
|
|
|
unsigned int major, minor;
|
|
|
int key_len, part, ret;
|
|
|
char *body;
|
|
|
@@ -804,7 +805,9 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
|
|
|
if (!disk)
|
|
|
return -ENODEV;
|
|
|
if (part) {
|
|
|
+ owner = disk->fops->owner;
|
|
|
put_disk(disk);
|
|
|
+ module_put(owner);
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
|
|
|
@@ -820,7 +823,9 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
|
|
|
ret = PTR_ERR(blkg);
|
|
|
rcu_read_unlock();
|
|
|
spin_unlock_irq(disk->queue->queue_lock);
|
|
|
+ owner = disk->fops->owner;
|
|
|
put_disk(disk);
|
|
|
+ module_put(owner);
|
|
|
/*
|
|
|
* If queue was bypassing, we should retry. Do so after a
|
|
|
* short msleep(). It isn't strictly necessary but queue
|
|
|
@@ -851,9 +856,13 @@ EXPORT_SYMBOL_GPL(blkg_conf_prep);
|
|
|
void blkg_conf_finish(struct blkg_conf_ctx *ctx)
|
|
|
__releases(ctx->disk->queue->queue_lock) __releases(rcu)
|
|
|
{
|
|
|
+ struct module *owner;
|
|
|
+
|
|
|
spin_unlock_irq(ctx->disk->queue->queue_lock);
|
|
|
rcu_read_unlock();
|
|
|
+ owner = ctx->disk->fops->owner;
|
|
|
put_disk(ctx->disk);
|
|
|
+ module_put(owner);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(blkg_conf_finish);
|
|
|
|