From dcd2a253f1c7183a900acae565c4513b1ad0de3f Mon Sep 17 00:00:00 2001 From: Maciej Szwed Date: Tue, 23 Jun 2020 10:04:23 +0200 Subject: [PATCH] spdk_dd: Exit gracefully on SIGINT Signed-off-by: Maciej Szwed Change-Id: I979dd7499a845867893acdb2620ce9f5147d4527 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/2996 Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Tomasz Zawadzki Reviewed-by: Ben Walker Reviewed-by: Paul Luse --- app/spdk_dd/spdk_dd.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/app/spdk_dd/spdk_dd.c b/app/spdk_dd/spdk_dd.c index a9a8d956c..2a5610bb7 100644 --- a/app/spdk_dd/spdk_dd.c +++ b/app/spdk_dd/spdk_dd.c @@ -122,6 +122,7 @@ struct dd_job { static struct dd_job g_job = {}; static int g_error = 0; static struct timespec g_start_time; +static bool g_interrupt; static void dd_target_populate_buffer(struct dd_io *io); @@ -236,7 +237,7 @@ dd_target_write(struct dd_io *io) uint64_t write_offset = write_region_start + read_offset; int rc = 0; - if (g_error != 0) { + if (g_error != 0 || g_interrupt == true) { if (g_job.outstanding == 0) { if (g_error == 0) { dd_show_progress(io->offset, io->length, true); @@ -295,7 +296,7 @@ dd_target_read(struct dd_io *io) struct dd_target *target = &g_job.input; int rc = 0; - if (g_error != 0) { + if (g_error != 0 || g_interrupt == true) { if (g_job.outstanding == 0) { dd_exit(g_error); } @@ -356,7 +357,7 @@ dd_target_populate_buffer(struct dd_io *io) io->offset = g_job.input.pos; io->length = spdk_min((uint64_t)g_opts.io_unit_size, g_job.copy_size - read_offset); - if (io->length == 0 || g_error != 0) { + if (io->length == 0 || g_error != 0 || g_interrupt == true) { if (g_job.outstanding == 0) { if (g_error == 0) { dd_show_progress(read_offset, io->length, true); @@ -558,6 +559,12 @@ dd_open_bdev(struct dd_target *target, const char *bdev_name, uint64_t skip_bloc return 0; } +static void dd_finish(void) +{ + /* Interrupt operation */ + g_interrupt = true; +} + static void dd_run(void *arg1) { @@ -823,6 +830,7 @@ main(int argc, char **argv) spdk_app_opts_init(&opts); opts.reactor_mask = "0x1"; + opts.shutdown_cb = dd_finish; rc = spdk_app_parse_args(argc, argv, &opts, "", g_cmdline_opts, parse_args, usage); if (rc == SPDK_APP_PARSE_ARGS_FAIL) { SPDK_ERRLOG("Invalid arguments\n");