From: Alexey Dobriyan Signed-off-by: Alexey Dobriyan Cc: Jens Axboe Signed-off-by: Andrew Morton --- block/blktrace.c | 6 ++++-- block/ll_rw_blk.c | 3 +-- include/linux/blkdev.h | 4 ++-- include/linux/sched.h | 3 ++- kernel/fork.c | 2 ++ 5 files changed, 11 insertions(+), 7 deletions(-) diff -puN block/blktrace.c~ifdef-blktrace-debugging-fields block/blktrace.c --- a/block/blktrace.c~ifdef-blktrace-debugging-fields +++ a/block/blktrace.c @@ -453,8 +453,10 @@ int blk_trace_ioctl(struct block_device **/ void blk_trace_shutdown(request_queue_t *q) { - blk_trace_startstop(q, 0); - blk_trace_remove(q); + if (q->blk_trace) { + blk_trace_startstop(q, 0); + blk_trace_remove(q); + } } /* diff -puN block/ll_rw_blk.c~ifdef-blktrace-debugging-fields block/ll_rw_blk.c --- a/block/ll_rw_blk.c~ifdef-blktrace-debugging-fields +++ a/block/ll_rw_blk.c @@ -1749,8 +1749,7 @@ static void blk_release_queue(struct kob if (q->queue_tags) __blk_queue_free_tags(q); - if (q->blk_trace) - blk_trace_shutdown(q); + blk_trace_shutdown(q); kmem_cache_free(requestq_cachep, q); } diff -puN include/linux/blkdev.h~ifdef-blktrace-debugging-fields include/linux/blkdev.h --- a/include/linux/blkdev.h~ifdef-blktrace-debugging-fields +++ a/include/linux/blkdev.h @@ -448,9 +448,9 @@ struct request_queue unsigned int sg_timeout; unsigned int sg_reserved_size; int node; - +#ifdef CONFIG_BLK_DEV_IO_TRACE struct blk_trace *blk_trace; - +#endif /* * reserved for flush operations */ diff -puN include/linux/sched.h~ifdef-blktrace-debugging-fields include/linux/sched.h --- a/include/linux/sched.h~ifdef-blktrace-debugging-fields +++ a/include/linux/sched.h @@ -784,8 +784,9 @@ struct task_struct { struct prio_array *array; unsigned short ioprio; +#ifdef CONFIG_BLK_DEV_IO_TRACE unsigned int btrace_seq; - +#endif unsigned long sleep_avg; unsigned long long timestamp, last_ran; unsigned long long sched_time; /* sched_clock time spent running */ diff -puN kernel/fork.c~ifdef-blktrace-debugging-fields kernel/fork.c --- a/kernel/fork.c~ifdef-blktrace-debugging-fields +++ a/kernel/fork.c @@ -177,7 +177,9 @@ static struct task_struct *dup_task_stru /* One for us, one for whoever does the "release_task()" (usually parent) */ atomic_set(&tsk->usage,2); atomic_set(&tsk->fs_excl, 0); +#ifdef CONFIG_BLK_DEV_IO_TRACE tsk->btrace_seq = 0; +#endif tsk->splice_pipe = NULL; return tsk; } _