diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-09-17 19:57:47 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-09-17 19:57:47 -0400 |
commit | 7ad67ca5534ee7c958559c4ad610f05c4578e361 (patch) | |
tree | dc6b6a8a6b70b5f25b07bcdc06d8e77e705f6822 /block/blk-sysfs.c | |
parent | 5260c2b863ef1152445ce93476c95d8c8a727eef (diff) | |
parent | 9c7eddf1b080f98fed1aadb74fe784f29bf77a08 (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.c | 50 |
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; |
1011 | unlock: | 1020 | unlock: |
1012 | mutex_unlock(&q->sysfs_lock); | 1021 | mutex_unlock(&q->sysfs_dir_lock); |
1013 | return ret; | 1022 | return ret; |
1014 | } | 1023 | } |
1015 | EXPORT_SYMBOL_GPL(blk_register_queue); | 1024 | EXPORT_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 | } |