From: Darrick J. Wong Date: Wed, 15 Jul 2020 19:40:53 +0000 (-0400) Subject: xfs_copy: flush target devices before exiting X-Git-Tag: v5.7.0-rc1~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4dcaa1608a60dad403dccb0097574b9d013a05fa;p=thirdparty%2Fxfsprogs-dev.git xfs_copy: flush target devices before exiting Flush the devices we're copying to before exiting, so that we can report any write errors. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Eric Sandeen --- diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index 2d087f716..38a20d37a 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -12,6 +12,7 @@ #include #include "xfs_copy.h" #include "libxlog.h" +#include "libfrog/platform.h" #define rounddown(x, y) (((x)/(y))*(y)) #define uuid_equal(s,d) (platform_uuid_compare((s),(d)) == 0) @@ -138,6 +139,14 @@ check_errors(void) int i, first_error = 0; for (i = 0; i < num_targets; i++) { + if (target[i].state != INACTIVE) { + if (platform_flush_device(target[i].fd, 0)) { + target[i].error = errno; + target[i].state = INACTIVE; + target[i].err_type = 2; + } + } + if (target[i].state == INACTIVE) { if (first_error == 0) { first_error++; @@ -145,10 +154,21 @@ check_errors(void) _("THE FOLLOWING COPIES FAILED TO COMPLETE\n")); } do_log(" %s -- ", target[i].name); - if (target[i].err_type == 0) + switch (target[i].err_type) { + case 0: do_log(_("write error")); - else + break; + case 1: do_log(_("lseek error")); + break; + case 2: + do_log(_("flush error")); + break; + default: + do_log(_("unknown error type %d"), + target[i].err_type); + break; + } do_log(_(" at offset %lld\n"), target[i].position); } }