| From 757d9140072054528b13bbe291583d9823cde195 Mon Sep 17 00:00:00 2001 |
| From: "Steven Rostedt (VMware)" <rostedt@goodmis.org> |
| Date: Thu, 16 Aug 2018 16:08:37 -0400 |
| Subject: tracing/blktrace: Fix to allow setting same value |
| |
| From: Steven Rostedt (VMware) <rostedt@goodmis.org> |
| |
| commit 757d9140072054528b13bbe291583d9823cde195 upstream. |
| |
| Masami Hiramatsu reported: |
| |
| 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 |
| |
| Link: http://lkml.kernel.org/r/20180816103802.08678002@gandalf.local.home |
| |
| Cc: Ingo Molnar <mingo@redhat.com> |
| Cc: Jens Axboe <axboe@kernel.dk> |
| Cc: linux-block@vger.kernel.org |
| Cc: stable@vger.kernel.org |
| Fixes: cd649b8bb830d ("blktrace: remove sysfs_blk_trace_enable_show/store()") |
| Reported-by: Masami Hiramatsu <mhiramat@kernel.org> |
| Tested-by: Masami Hiramatsu <mhiramat@kernel.org> |
| Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| kernel/trace/blktrace.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/kernel/trace/blktrace.c |
| +++ b/kernel/trace/blktrace.c |
| @@ -1809,6 +1809,10 @@ static ssize_t sysfs_blk_trace_attr_stor |
| mutex_lock(&q->blk_trace_mutex); |
| |
| if (attr == &dev_attr_enable) { |
| + if (!!value == !!q->blk_trace) { |
| + ret = 0; |
| + goto out_unlock_bdev; |
| + } |
| if (value) |
| ret = blk_trace_setup_queue(q, bdev); |
| else |