|
@@ -902,17 +902,20 @@ int blk_register_queue(struct gendisk *disk)
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
+ if (q->mq_ops)
|
|
|
+ blk_mq_register_dev(dev, q);
|
|
|
+
|
|
|
+ /* Prevent changes through sysfs until registration is completed. */
|
|
|
+ mutex_lock(&q->sysfs_lock);
|
|
|
+
|
|
|
ret = kobject_add(&q->kobj, kobject_get(&dev->kobj), "%s", "queue");
|
|
|
if (ret < 0) {
|
|
|
blk_trace_remove_sysfs(dev);
|
|
|
- return ret;
|
|
|
+ goto unlock;
|
|
|
}
|
|
|
|
|
|
kobject_uevent(&q->kobj, KOBJ_ADD);
|
|
|
|
|
|
- if (q->mq_ops)
|
|
|
- blk_mq_register_dev(dev, q);
|
|
|
-
|
|
|
blk_wb_init(q);
|
|
|
|
|
|
if (q->request_fn || (q->mq_ops && q->elevator)) {
|
|
@@ -922,11 +925,13 @@ int blk_register_queue(struct gendisk *disk)
|
|
|
kobject_del(&q->kobj);
|
|
|
blk_trace_remove_sysfs(dev);
|
|
|
kobject_put(&dev->kobj);
|
|
|
- return ret;
|
|
|
+ goto unlock;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- return 0;
|
|
|
+ ret = 0;
|
|
|
+unlock:
|
|
|
+ mutex_unlock(&q->sysfs_lock);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
void blk_unregister_queue(struct gendisk *disk)
|