summaryrefslogtreecommitdiffstats
path: root/block/blk-sysfs.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2019-09-17 19:57:47 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2019-09-17 19:57:47 -0400
commit7ad67ca5534ee7c958559c4ad610f05c4578e361 (patch)
treedc6b6a8a6b70b5f25b07bcdc06d8e77e705f6822 /block/blk-sysfs.c
parent5260c2b863ef1152445ce93476c95d8c8a727eef (diff)
parent9c7eddf1b080f98fed1aadb74fe784f29bf77a08 (diff)
Merge tag 'for-5.4/block-2019-09-16' of git://git.kernel.dk/linux-block
Pull block updates from Jens Axboe: - Two NVMe pull requests: - ana log parse fix from Anton - nvme quirks support for Apple devices from Ben - fix missing bio completion tracing for multipath stack devices from Hannes and Mikhail - IP TOS settings for nvme rdma and tcp transports from Israel - rq_dma_dir cleanups from Israel - tracing for Get LBA Status command from Minwoo - Some nvme-tcp cleanups from Minwoo, Potnuri and Myself - Some consolidation between the fabrics transports for handling the CAP register - reset race with ns scanning fix for fabrics (move fabrics commands to a dedicated request queue with a different lifetime from the admin request queue)." - controller reset and namespace scan races fixes - nvme discovery log change uevent support - naming improvements from Keith - multiple discovery controllers reject fix from James - some regular cleanups from various people - Series fixing (and re-fixing) null_blk debug printing and nr_devices checks (André) - A few pull requests from Song, with fixes from Andy, Guoqing, Guilherme, Neil, Nigel, and Yufen. - REQ_OP_ZONE_RESET_ALL support (Chaitanya) - Bio merge handling unification (Christoph) - Pick default elevator correctly for devices with special needs (Damien) - Block stats fixes (Hou) - Timeout and support devices nbd fixes (Mike) - Series fixing races around elevator switching and device add/remove (Ming) - sed-opal cleanups (Revanth) - Per device weight support for BFQ (Fam) - Support for blk-iocost, a new model that can properly account cost of IO workloads. (Tejun) - blk-cgroup writeback fixes (Tejun) - paride queue init fixes (zhengbin) - blk_set_runtime_active() cleanup (Stanley) - Block segment mapping optimizations (Bart) - lightnvm fixes (Hans/Minwoo/YueHaibing) - Various little fixes and cleanups * tag 'for-5.4/block-2019-09-16' of git://git.kernel.dk/linux-block: (186 commits) null_blk: format pr_* logs with pr_fmt null_blk: match the type of parameter nr_devices null_blk: do not fail the module load with zero devices block: also check RQF_STATS in blk_mq_need_time_stamp() block: make rq sector size accessible for block stats bfq: Fix bfq linkage error raid5: use bio_end_sector in r5_next_bio raid5: remove STRIPE_OPS_REQ_PENDING md: add feature flag MD_FEATURE_RAID0_LAYOUT md/raid0: avoid RAID0 data corruption due to layout confusion. raid5: don't set STRIPE_HANDLE to stripe which is in batch list raid5: don't increment read_errors on EILSEQ return nvmet: fix a wrong error status returned in error log page nvme: send discovery log page change events to userspace nvme: add uevent variables for controller devices nvme: enable aen regardless of the presence of I/O queues nvme-fabrics: allow discovery subsystems accept a kato nvmet: Use PTR_ERR_OR_ZERO() in nvmet_init_discovery() nvme: Remove redundant assignment of cq vector nvme: Assign subsys instance from first ctrl ...
Diffstat (limited to 'block/blk-sysfs.c')
-rw-r--r--block/blk-sysfs.c50
1 files changed, 31 insertions, 19 deletions
diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
index 9bfa3ea4ed63..b82736c781c5 100644
--- a/block/blk-sysfs.c
+++ b/block/blk-sysfs.c
@@ -941,14 +941,14 @@ int blk_register_queue(struct gendisk *disk)
941 int ret; 941 int ret;
942 struct device *dev = disk_to_dev(disk); 942 struct device *dev = disk_to_dev(disk);
943 struct request_queue *q = disk->queue; 943 struct request_queue *q = disk->queue;
944 bool has_elevator = false;
944 945
945 if (WARN_ON(!q)) 946 if (WARN_ON(!q))
946 return -ENXIO; 947 return -ENXIO;
947 948
948 WARN_ONCE(test_bit(QUEUE_FLAG_REGISTERED, &q->queue_flags), 949 WARN_ONCE(blk_queue_registered(q),
949 "%s is registering an already registered queue\n", 950 "%s is registering an already registered queue\n",
950 kobject_name(&dev->kobj)); 951 kobject_name(&dev->kobj));
951 blk_queue_flag_set(QUEUE_FLAG_REGISTERED, q);
952 952
953 /* 953 /*
954 * SCSI probing may synchronously create and destroy a lot of 954 * SCSI probing may synchronously create and destroy a lot of
@@ -968,8 +968,7 @@ int blk_register_queue(struct gendisk *disk)
968 if (ret) 968 if (ret)
969 return ret; 969 return ret;
970 970
971 /* Prevent changes through sysfs until registration is completed. */ 971 mutex_lock(&q->sysfs_dir_lock);
972 mutex_lock(&q->sysfs_lock);
973 972
974 ret = kobject_add(&q->kobj, kobject_get(&dev->kobj), "%s", "queue"); 973 ret = kobject_add(&q->kobj, kobject_get(&dev->kobj), "%s", "queue");
975 if (ret < 0) { 974 if (ret < 0) {
@@ -990,26 +989,36 @@ int blk_register_queue(struct gendisk *disk)
990 blk_mq_debugfs_register(q); 989 blk_mq_debugfs_register(q);
991 } 990 }
992 991
993 kobject_uevent(&q->kobj, KOBJ_ADD); 992 /*
994 993 * The flag of QUEUE_FLAG_REGISTERED isn't set yet, so elevator
995 wbt_enable_default(q); 994 * switch won't happen at all.
996 995 */
997 blk_throtl_register_queue(q);
998
999 if (q->elevator) { 996 if (q->elevator) {
1000 ret = elv_register_queue(q); 997 ret = elv_register_queue(q, false);
1001 if (ret) { 998 if (ret) {
1002 mutex_unlock(&q->sysfs_lock); 999 mutex_unlock(&q->sysfs_dir_lock);
1003 kobject_uevent(&q->kobj, KOBJ_REMOVE);
1004 kobject_del(&q->kobj); 1000 kobject_del(&q->kobj);
1005 blk_trace_remove_sysfs(dev); 1001 blk_trace_remove_sysfs(dev);
1006 kobject_put(&dev->kobj); 1002 kobject_put(&dev->kobj);
1007 return ret; 1003 return ret;
1008 } 1004 }
1005 has_elevator = true;
1009 } 1006 }
1007
1008 mutex_lock(&q->sysfs_lock);
1009 blk_queue_flag_set(QUEUE_FLAG_REGISTERED, q);
1010 wbt_enable_default(q);
1011 blk_throtl_register_queue(q);
1012
1013 /* Now everything is ready and send out KOBJ_ADD uevent */
1014 kobject_uevent(&q->kobj, KOBJ_ADD);
1015 if (has_elevator)
1016 kobject_uevent(&q->elevator->kobj, KOBJ_ADD);
1017 mutex_unlock(&q->sysfs_lock);
1018
1010 ret = 0; 1019 ret = 0;
1011unlock: 1020unlock:
1012 mutex_unlock(&q->sysfs_lock); 1021 mutex_unlock(&q->sysfs_dir_lock);
1013 return ret; 1022 return ret;
1014} 1023}
1015EXPORT_SYMBOL_GPL(blk_register_queue); 1024EXPORT_SYMBOL_GPL(blk_register_queue);
@@ -1029,7 +1038,7 @@ void blk_unregister_queue(struct gendisk *disk)
1029 return; 1038 return;
1030 1039
1031 /* Return early if disk->queue was never registered. */ 1040 /* Return early if disk->queue was never registered. */
1032 if (!test_bit(QUEUE_FLAG_REGISTERED, &q->queue_flags)) 1041 if (!blk_queue_registered(q))
1033 return; 1042 return;
1034 1043
1035 /* 1044 /*
@@ -1038,25 +1047,28 @@ void blk_unregister_queue(struct gendisk *disk)
1038 * concurrent elv_iosched_store() calls. 1047 * concurrent elv_iosched_store() calls.
1039 */ 1048 */
1040 mutex_lock(&q->sysfs_lock); 1049 mutex_lock(&q->sysfs_lock);
1041
1042 blk_queue_flag_clear(QUEUE_FLAG_REGISTERED, q); 1050 blk_queue_flag_clear(QUEUE_FLAG_REGISTERED, q);
1051 mutex_unlock(&q->sysfs_lock);
1043 1052
1053 mutex_lock(&q->sysfs_dir_lock);
1044 /* 1054 /*
1045 * Remove the sysfs attributes before unregistering the queue data 1055 * Remove the sysfs attributes before unregistering the queue data
1046 * structures that can be modified through sysfs. 1056 * structures that can be modified through sysfs.
1047 */ 1057 */
1048 if (queue_is_mq(q)) 1058 if (queue_is_mq(q))
1049 blk_mq_unregister_dev(disk_to_dev(disk), q); 1059 blk_mq_unregister_dev(disk_to_dev(disk), q);
1050 mutex_unlock(&q->sysfs_lock);
1051 1060
1052 kobject_uevent(&q->kobj, KOBJ_REMOVE); 1061 kobject_uevent(&q->kobj, KOBJ_REMOVE);
1053 kobject_del(&q->kobj); 1062 kobject_del(&q->kobj);
1054 blk_trace_remove_sysfs(disk_to_dev(disk)); 1063 blk_trace_remove_sysfs(disk_to_dev(disk));
1055 1064
1056 mutex_lock(&q->sysfs_lock); 1065 /*
1066 * q->kobj has been removed, so it is safe to check if elevator
1067 * exists without holding q->sysfs_lock.
1068 */
1057 if (q->elevator) 1069 if (q->elevator)
1058 elv_unregister_queue(q); 1070 elv_unregister_queue(q);
1059 mutex_unlock(&q->sysfs_lock); 1071 mutex_unlock(&q->sysfs_dir_lock);
1060 1072
1061 kobject_put(&disk_to_dev(disk)->kobj); 1073 kobject_put(&disk_to_dev(disk)->kobj);
1062} 1074}