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.
> 

Reply via email to