diff options
-rw-r--r-- | block/blk-sysfs.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index 070d81bae1d5..002af836aa87 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c | |||
@@ -902,17 +902,20 @@ int blk_register_queue(struct gendisk *disk) | |||
902 | if (ret) | 902 | if (ret) |
903 | return ret; | 903 | return ret; |
904 | 904 | ||
905 | if (q->mq_ops) | ||
906 | blk_mq_register_dev(dev, q); | ||
907 | |||
908 | /* Prevent changes through sysfs until registration is completed. */ | ||
909 | mutex_lock(&q->sysfs_lock); | ||
910 | |||
905 | ret = kobject_add(&q->kobj, kobject_get(&dev->kobj), "%s", "queue"); | 911 | ret = kobject_add(&q->kobj, kobject_get(&dev->kobj), "%s", "queue"); |
906 | if (ret < 0) { | 912 | if (ret < 0) { |
907 | blk_trace_remove_sysfs(dev); | 913 | blk_trace_remove_sysfs(dev); |
908 | return ret; | 914 | goto unlock; |
909 | } | 915 | } |
910 | 916 | ||
911 | kobject_uevent(&q->kobj, KOBJ_ADD); | 917 | kobject_uevent(&q->kobj, KOBJ_ADD); |
912 | 918 | ||
913 | if (q->mq_ops) | ||
914 | blk_mq_register_dev(dev, q); | ||
915 | |||
916 | blk_wb_init(q); | 919 | blk_wb_init(q); |
917 | 920 | ||
918 | if (q->request_fn || (q->mq_ops && q->elevator)) { | 921 | if (q->request_fn || (q->mq_ops && q->elevator)) { |
@@ -922,11 +925,13 @@ int blk_register_queue(struct gendisk *disk) | |||
922 | kobject_del(&q->kobj); | 925 | kobject_del(&q->kobj); |
923 | blk_trace_remove_sysfs(dev); | 926 | blk_trace_remove_sysfs(dev); |
924 | kobject_put(&dev->kobj); | 927 | kobject_put(&dev->kobj); |
925 | return ret; | 928 | goto unlock; |
926 | } | 929 | } |
927 | } | 930 | } |
928 | 931 | ret = 0; | |
929 | return 0; | 932 | unlock: |
933 | mutex_unlock(&q->sysfs_lock); | ||
934 | return ret; | ||
930 | } | 935 | } |
931 | 936 | ||
932 | void blk_unregister_queue(struct gendisk *disk) | 937 | void blk_unregister_queue(struct gendisk *disk) |