From ab6809de8aa6c1e2bac1e2d9167e5232f0cccfeb Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Sat, 4 Nov 2017 22:10:00 -0600 Subject: [PATCH] blktrace: abort if device ioctl setup fails If we fail doing the BLKTRACESETUP ioctl, blktrace still marches on and sets up the rest. This results in errors like the below: blktrace /dev/sdf BLKTRACESETUP(2) /dev/sdf failed: 5/Input/output error Thread 1 failed open /sys/kernel/debug/block/(null)/trace1: 2/No such file or directory Thread 3 failed open /sys/kernel/debug/block/(null)/trace3: 2/No such file or directory Thread 2 failed open /sys/kernel/debug/block/(null)/trace2: 2/No such file or directory [...] FAILED to start thread on CPU 0: 1/Operation not permitted FAILED to start thread on CPU 1: 1/Operation not permitted FAILED to start thread on CPU 2: 1/Operation not permitted and blktrace continues to run, though it can't do anything in this state. If the ioctl setup fails, just abort. Signed-off-by: Jens Axboe --- blktrace.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/blktrace.c b/blktrace.c index e8f2f87..e048f68 100644 --- a/blktrace.c +++ b/blktrace.c @@ -1066,9 +1066,10 @@ static void close_client_connections(void) } } -static void setup_buts(void) +static int setup_buts(void) { struct list_head *p; + int ret = 0; __list_for_each(p, &devpaths) { struct blk_user_trace_setup buts; @@ -1086,10 +1087,14 @@ static void setup_buts(void) free(dpp->stats); dpp->stats = calloc(dpp->ncpus, sizeof(*dpp->stats)); memset(dpp->stats, 0, dpp->ncpus * sizeof(*dpp->stats)); - } else + } else { fprintf(stderr, "BLKTRACESETUP(2) %s failed: %d/%s\n", dpp->path, errno, strerror(errno)); + ret++; + } } + + return ret; } static void start_buts(void) @@ -2676,7 +2681,8 @@ static int run_tracers(void) if (net_mode == Net_client) printf("blktrace: connecting to %s\n", hostname); - setup_buts(); + if (setup_buts()) + return 1; if (use_tracer_devpaths()) { if (setup_tracer_devpaths()) -- 2.25.1