Current trace-enable attribute in sysfs returns an error if user writes the same setting value as current one, e.g. # cat /sys/block/sda/trace/enable 0 # echo 0 > /sys/block/sda/trace/enable bash: echo: write error: Invalid argument # echo 1 > /sys/block/sda/trace/enable # echo 1 > /sys/block/sda/trace/enable bash: echo: write error: Device or resource busy But this is not a preferred behavior, it should ignore if new setting is same as current one. This fixes the problem as below. # cat /sys/block/sda/trace/enable 0 # echo 0 > /sys/block/sda/trace/enable # echo 1 > /sys/block/sda/trace/enable # echo 1 > /sys/block/sda/trace/enable Signed-off-by: Masami Hiramatsu <mhiramat@xxxxxxxxxx> Cc: Jens Axboe <axboe@xxxxxxxxx> Cc: linux-block@xxxxxxxxxxxxxxx --- kernel/trace/blktrace.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index 987d9a9ae283..e67db1e8a000 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c @@ -1602,11 +1602,11 @@ static int blk_trace_remove_queue(struct request_queue *q) struct blk_trace *bt; bt = xchg(&q->blk_trace, NULL); - if (bt == NULL) - return -EINVAL; + if (bt != NULL) { + put_probe_ref(); + blk_trace_free(bt); + } - put_probe_ref(); - blk_trace_free(bt); return 0; } @@ -1619,6 +1619,9 @@ static int blk_trace_setup_queue(struct request_queue *q, struct blk_trace *bt = NULL; int ret = -ENOMEM; + if (q->blk_trace) + return 0; + bt = kzalloc(sizeof(*bt), GFP_KERNEL); if (!bt) return -ENOMEM;