Commit 48c0d4d4c04dd520c55e0fd756fa4e7c83de3d13

Authored by Zdenek Kabelac
Committed by Jens Axboe
1 parent 1e6f2dc119

Add missing blk_trace_remove_sysfs to be in pair with blk_trace_init_sysfs

Add missing blk_trace_remove_sysfs to be in pair with blk_trace_init_sysfs
introduced in commit 1d54ad6da9192fed5dd3b60224d9f2dfea0dcd82.
Release kobject also in case the request_fn is NULL.

Problem was noticed via kmemleak backtrace when some sysfs entries were
note properly destroyed during  device removal:

unreferenced object 0xffff88001aa76640 (size 80):
  comm "lvcreate", pid 2120, jiffies 4294885144
  hex dump (first 32 bytes):
    01 00 00 00 00 00 00 00 f0 65 a7 1a 00 88 ff ff  .........e......
    90 66 a7 1a 00 88 ff ff 86 1d 53 81 ff ff ff ff  .f........S.....
  backtrace:
    [<ffffffff813f9cc6>] kmemleak_alloc+0x26/0x60
    [<ffffffff8111d693>] kmem_cache_alloc+0x133/0x1c0
    [<ffffffff81195891>] sysfs_new_dirent+0x41/0x120
    [<ffffffff81194b0c>] sysfs_add_file_mode+0x3c/0xb0
    [<ffffffff81197c81>] internal_create_group+0xc1/0x1a0
    [<ffffffff81197d93>] sysfs_create_group+0x13/0x20
    [<ffffffff810d8004>] blk_trace_init_sysfs+0x14/0x20
    [<ffffffff8123f45c>] blk_register_queue+0x3c/0xf0
    [<ffffffff812447e4>] add_disk+0x94/0x160
    [<ffffffffa00d8b08>] dm_create+0x598/0x6e0 [dm_mod]
    [<ffffffffa00de951>] dev_create+0x51/0x350 [dm_mod]
    [<ffffffffa00de823>] ctl_ioctl+0x1a3/0x240 [dm_mod]
    [<ffffffffa00de8f2>] dm_compat_ctl_ioctl+0x12/0x20 [dm_mod]
    [<ffffffff81177bfd>] compat_sys_ioctl+0xcd/0x4f0
    [<ffffffff81036ed8>] sysenter_dispatch+0x7/0x2c
    [<ffffffffffffffff>] 0xffffffffffffffff

Signed-off-by: Zdenek Kabelac <zkabelac@redhat.com>
Reviewed-by: Li Zefan <lizf@cn.fujitsu.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>

Showing 3 changed files with 13 additions and 5 deletions Side-by-side Diff

... ... @@ -452,6 +452,7 @@
452 452 if (ret) {
453 453 kobject_uevent(&q->kobj, KOBJ_REMOVE);
454 454 kobject_del(&q->kobj);
  455 + blk_trace_remove_sysfs(disk_to_dev(disk));
455 456 return ret;
456 457 }
457 458  
458 459  
... ... @@ -465,12 +466,12 @@
465 466 if (WARN_ON(!q))
466 467 return;
467 468  
468   - if (q->request_fn) {
  469 + if (q->request_fn)
469 470 elv_unregister_queue(q);
470 471  
471   - kobject_uevent(&q->kobj, KOBJ_REMOVE);
472   - kobject_del(&q->kobj);
473   - kobject_put(&disk_to_dev(disk)->kobj);
474   - }
  472 + kobject_uevent(&q->kobj, KOBJ_REMOVE);
  473 + kobject_del(&q->kobj);
  474 + blk_trace_remove_sysfs(disk_to_dev(disk));
  475 + kobject_put(&disk_to_dev(disk)->kobj);
475 476 }
include/linux/blktrace_api.h
... ... @@ -198,6 +198,7 @@
198 198 char __user *arg);
199 199 extern int blk_trace_startstop(struct request_queue *q, int start);
200 200 extern int blk_trace_remove(struct request_queue *q);
  201 +extern void blk_trace_remove_sysfs(struct device *dev);
201 202 extern int blk_trace_init_sysfs(struct device *dev);
202 203  
203 204 extern struct attribute_group blk_trace_attr_group;
... ... @@ -211,6 +212,7 @@
211 212 # define blk_trace_startstop(q, start) (-ENOTTY)
212 213 # define blk_trace_remove(q) (-ENOTTY)
213 214 # define blk_add_trace_msg(q, fmt, ...) do { } while (0)
  215 +# define blk_trace_remove_sysfs(struct device *dev) do { } while (0)
214 216 static inline int blk_trace_init_sysfs(struct device *dev)
215 217 {
216 218 return 0;
kernel/trace/blktrace.c
... ... @@ -1657,6 +1657,11 @@
1657 1657 return sysfs_create_group(&dev->kobj, &blk_trace_attr_group);
1658 1658 }
1659 1659  
  1660 +void blk_trace_remove_sysfs(struct device *dev)
  1661 +{
  1662 + sysfs_remove_group(&dev->kobj, &blk_trace_attr_group);
  1663 +}
  1664 +
1660 1665 #endif /* CONFIG_BLK_DEV_IO_TRACE */
1661 1666  
1662 1667 #ifdef CONFIG_EVENT_TRACING