diff mbox series

[SRU,linux-aws-bionic,2/2] block: don't show io_timeout if driver has no timeout handler

Message ID 20190826184756.21995-5-kamal@canonical.com
State New
Headers show
Series None | expand

Commit Message

Kamal Mostafa Aug. 26, 2019, 6:47 p.m. UTC
From: Weiping Zhang <zhangweiping@didiglobal.com>

BugLink: https://bugs.launchpad.net/bugs/1841461

If the low level driver has no timeout handler, the
/sys/block/<disk>/queue/io_timeout will not be displayed.

Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Weiping Zhang <zhangweiping@didiglobal.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
(backported from commit 4d25339e32a1b6e1f490bb78b1e5b0fa9eb3e073)
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
---
 block/blk-sysfs.c | 30 ++++++++++++++++++++++++++++--
 1 file changed, 28 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
index 06eb8ea600e5..085136c37753 100644
--- a/block/blk-sysfs.c
+++ b/block/blk-sysfs.c
@@ -710,7 +710,7 @@  static struct queue_sysfs_entry throtl_sample_time_entry = {
 };
 #endif
 
-static struct attribute *default_attrs[] = {
+static struct attribute *queue_attrs[] = {
 	&queue_requests_entry.attr,
 	&queue_ra_entry.attr,
 	&queue_max_hw_sectors_entry.attr,
@@ -750,6 +750,25 @@  static struct attribute *default_attrs[] = {
 	NULL,
 };
 
+static umode_t queue_attr_visible(struct kobject *kobj, struct attribute *attr,
+				int n)
+{
+	struct request_queue *q =
+		container_of(kobj, struct request_queue, kobj);
+
+	if (attr == &queue_io_timeout_entry.attr &&
+		(!q->mq_ops || !q->mq_ops->timeout))
+			return 0;
+
+	return attr->mode;
+}
+
+static struct attribute_group queue_attr_group = {
+	.attrs = queue_attrs,
+	.is_visible = queue_attr_visible,
+};
+
+
 #define to_queue(atr) container_of((atr), struct queue_sysfs_entry, attr)
 
 static ssize_t
@@ -876,7 +895,6 @@  static const struct sysfs_ops queue_sysfs_ops = {
 
 struct kobj_type blk_queue_ktype = {
 	.sysfs_ops	= &queue_sysfs_ops,
-	.default_attrs	= default_attrs,
 	.release	= blk_release_queue,
 };
 
@@ -922,6 +940,14 @@  int blk_register_queue(struct gendisk *disk)
 		goto unlock;
 	}
 
+	ret = sysfs_create_group(&q->kobj, &queue_attr_group);
+	if (ret) {
+		blk_trace_remove_sysfs(dev);
+		kobject_del(&q->kobj);
+		kobject_put(&dev->kobj);
+		goto unlock;
+	}
+
 	if (q->mq_ops) {
 		__blk_mq_register_dev(dev, q);
 		blk_mq_debugfs_register(q);