block: don't show io_timeout if driver has no timeout handler
authorWeiping Zhang <zhangweiping@didiglobal.com>
Tue, 2 Apr 2019 13:14:30 +0000 (21:14 +0800)
committerJens Axboe <axboe@kernel.dk>
Mon, 22 Apr 2019 15:48:12 +0000 (09:48 -0600)
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>
block/blk-sysfs.c

index 422327089e0fd963dbfaf346be68f7951da15df2..a16a02c52a8538311974343137abd82b00f72443 100644 (file)
@@ -728,7 +728,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,
@@ -770,6 +770,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
@@ -890,7 +909,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,
 };
 
@@ -939,6 +957,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 (queue_is_mq(q)) {
                __blk_mq_register_dev(dev, q);
                blk_mq_debugfs_register(q);