On Tue, Jan 08, 2019 at 04:57:40PM -0800, Bart Van Assche wrote: Hi Bart, Sorry to reply so late. > On Mon, 2019-01-07 at 20:52 +0800, Weiping Zhang wrote: > > If the low level driver has no timerout handler, the > ^^^^^^^^ > timeout? > OK, I'll fix this spelling mistake. > > +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) { > > + if (!q->mq_ops || !q->mq_ops->timeout) > > + return 0; > > + } > > Are there any legacy block drivers left? Do we really need the mq_ops test? As request_fn removed, now we can use mq_ops->timeout directly. > > Additionally, please combine the two nested if-statements into a single > if-statement. OK, it's more clear. > > > @@ -942,6 +961,14 @@ int blk_register_queue(struct gendisk *disk) > > goto unlock; > > } > > > > + ret = sysfs_create_group(&q->kobj, &queue_attr_group); > > + if (ret) { > > + kobject_del(&q->kobj); > > + blk_trace_remove_sysfs(dev); > > + kobject_put(&dev->kobj); > > + goto unlock; > > + } > > Are you sure the "goto unlock" is OK here? Shouldn't kobject_del() be called > to undo the kobject_add() call if sysfs_create_group() fails? Sorry, can you tell me why it's may be not safe, if goto unlock here, if failed to call sysfs_create_group, I think we should call kobject_del. > > > if (queue_is_mq(q)) { > > __blk_mq_register_dev(dev, q); > > blk_mq_debugfs_register(q); > > @@ -958,6 +985,7 @@ int blk_register_queue(struct gendisk *disk) > > if (ret) { > > mutex_unlock(&q->sysfs_lock); > > kobject_uevent(&q->kobj, KOBJ_REMOVE); > > + sysfs_remove_group(&q->kobj, &queue_attr_group); > > kobject_del(&q->kobj); > > blk_trace_remove_sysfs(dev); > > kobject_put(&dev->kobj); > > @@ -1006,6 +1034,7 @@ void blk_unregister_queue(struct gendisk *disk) > > blk_mq_unregister_dev(disk_to_dev(disk), q); > > mutex_unlock(&q->sysfs_lock); > > > > + sysfs_remove_group(&q->kobj, &queue_attr_group); > > kobject_uevent(&q->kobj, KOBJ_REMOVE); > > kobject_del(&q->kobj); > > blk_trace_remove_sysfs(disk_to_dev(disk)); > > Is it necessary to call sysfs_remove_group() explicitly? Isn't this something > kobject_del() does automatically? I check kobject_del, it's same as you said, kobject_del->sysfs_remove_dir->kernfs_remove, it will remove all files and subdirectories belong this kobject directory. > > Thanks, > Thanks Weiping > Bart. >