blktrace: add trace/ to /sys/block/sda
Impact: allow ftrace-plugin blktrace to trace device-mapper devices To trace a single partition: # echo 1 > /sys/block/sda/sda1/enable To trace the whole sda instead: # echo 1 > /sys/block/sda/enable Thus we also fix an issue reported by Ted, that ftrace-plugin blktrace can't be used to trace device-mapper devices. Now: # echo 1 > /sys/block/dm-0/trace/enable echo: write error: No such device or address # mount -t ext4 /dev/dm-0 /mnt # echo 1 > /sys/block/dm-0/trace/enable # echo blk > /debug/tracing/current_tracer Reported-by: Theodore Tso <tytso@mit.edu> Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> Acked-by: "Theodore Ts'o" <tytso@mit.edu> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Shawn Du <duyuyang@gmail.com> Cc: Jens Axboe <jens.axboe@oracle.com> LKML-Reference: <49E42665.6020506@cn.fujitsu.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
@@ -387,16 +387,21 @@ struct kobj_type blk_queue_ktype = {
|
|||||||
int blk_register_queue(struct gendisk *disk)
|
int blk_register_queue(struct gendisk *disk)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
struct device *dev = disk_to_dev(disk);
|
||||||
|
|
||||||
struct request_queue *q = disk->queue;
|
struct request_queue *q = disk->queue;
|
||||||
|
|
||||||
if (WARN_ON(!q))
|
if (WARN_ON(!q))
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
|
ret = blk_trace_init_sysfs(dev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
if (!q->request_fn)
|
if (!q->request_fn)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ret = kobject_add(&q->kobj, kobject_get(&disk_to_dev(disk)->kobj),
|
ret = kobject_add(&q->kobj, kobject_get(&dev->kobj),
|
||||||
"%s", "queue");
|
"%s", "queue");
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
@@ -198,6 +198,7 @@ extern int blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
|
|||||||
char __user *arg);
|
char __user *arg);
|
||||||
extern int blk_trace_startstop(struct request_queue *q, int start);
|
extern int blk_trace_startstop(struct request_queue *q, int start);
|
||||||
extern int blk_trace_remove(struct request_queue *q);
|
extern int blk_trace_remove(struct request_queue *q);
|
||||||
|
extern int blk_trace_init_sysfs(struct device *dev);
|
||||||
|
|
||||||
extern struct attribute_group blk_trace_attr_group;
|
extern struct attribute_group blk_trace_attr_group;
|
||||||
|
|
||||||
@@ -210,6 +211,11 @@ extern struct attribute_group blk_trace_attr_group;
|
|||||||
# define blk_trace_startstop(q, start) (-ENOTTY)
|
# define blk_trace_startstop(q, start) (-ENOTTY)
|
||||||
# define blk_trace_remove(q) (-ENOTTY)
|
# define blk_trace_remove(q) (-ENOTTY)
|
||||||
# define blk_add_trace_msg(q, fmt, ...) do { } while (0)
|
# define blk_add_trace_msg(q, fmt, ...) do { } while (0)
|
||||||
|
static inline int blk_trace_init_sysfs(struct device *dev)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_BLK_DEV_IO_TRACE */
|
#endif /* CONFIG_BLK_DEV_IO_TRACE */
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
@@ -1644,3 +1644,8 @@ out:
|
|||||||
return ret ? ret : count;
|
return ret ? ret : count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int blk_trace_init_sysfs(struct device *dev)
|
||||||
|
{
|
||||||
|
return sysfs_create_group(&dev->kobj, &blk_trace_attr_group);
|
||||||
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user