From 2deb556f99ae439125674fa3c6d77424048fd30c Mon Sep 17 00:00:00 2001 From: Pino Toscano Date: Mon, 8 Jul 2019 15:25:53 +0100 Subject: [PATCH 07/39] block/ssh: Do not report read/write/flush errors to the user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RH-Author: Pino Toscano Message-id: <20190708152601.21123-3-ptoscano@redhat.com> Patchwork-id: 89418 O-Subject: [RHEL-8.1.0 qemu-kvm PATCH v3 02/10] block/ssh: Do not report read/write/flush errors to the user Bugzilla: 1513367 RH-Acked-by: Philippe Mathieu-Daudé RH-Acked-by: Max Reitz RH-Acked-by: Miroslav Rezanina RH-Acked-by: Markus Armbruster From: Markus Armbruster Callbacks ssh_co_readv(), ssh_co_writev(), ssh_co_flush() report errors to the user with error_printf(). They shouldn't, it's their caller's job. Replace by a suitable trace point. While there, drop the unreachable !s->sftp case. Perhaps we should convert this part of the block driver interface to Error, so block drivers can pass more detail to their callers. Not today. Cc: "Richard W.M. Jones" Cc: Kevin Wolf Cc: Max Reitz Cc: qemu-block@nongnu.org Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake Message-Id: <20190417190641.26814-3-armbru@redhat.com> (cherry picked from commit 6b3048cee0e0eccd27b62954ecc57c4a1bceb976) Signed-off-by: Philippe Mathieu-Daudé Signed-off-by: Danilo C. L. de Paula --- block/ssh.c | 38 +++++++++++++------------------------- block/trace-events | 3 +++ 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/block/ssh.c b/block/ssh.c index dfb3e3c..89abce0 100644 --- a/block/ssh.c +++ b/block/ssh.c @@ -159,31 +159,19 @@ sftp_error_setg(Error **errp, BDRVSSHState *s, const char *fs, ...) g_free(msg); } -static void GCC_FMT_ATTR(2, 3) -sftp_error_report(BDRVSSHState *s, const char *fs, ...) +static void sftp_error_trace(BDRVSSHState *s, const char *op) { - va_list args; - - va_start(args, fs); - error_vprintf(fs, args); + char *ssh_err; + int ssh_err_code; + unsigned long sftp_err_code; - if ((s)->sftp) { - char *ssh_err; - int ssh_err_code; - unsigned long sftp_err_code; + /* This is not an errno. See . */ + ssh_err_code = libssh2_session_last_error(s->session, + &ssh_err, NULL, 0); + /* See . */ + sftp_err_code = libssh2_sftp_last_error((s)->sftp); - /* This is not an errno. See . */ - ssh_err_code = libssh2_session_last_error(s->session, - &ssh_err, NULL, 0); - /* See . */ - sftp_err_code = libssh2_sftp_last_error((s)->sftp); - - error_printf(": %s (libssh2 error code: %d, sftp error code: %lu)", - ssh_err, ssh_err_code, sftp_err_code); - } - - va_end(args); - error_printf("\n"); + trace_sftp_error(op, ssh_err, ssh_err_code, sftp_err_code); } static int parse_uri(const char *filename, QDict *options, Error **errp) @@ -1035,7 +1023,7 @@ static coroutine_fn int ssh_read(BDRVSSHState *s, BlockDriverState *bs, goto again; } if (r < 0) { - sftp_error_report(s, "read failed"); + sftp_error_trace(s, "read"); s->offset = -1; return -EIO; } @@ -1105,7 +1093,7 @@ static int ssh_write(BDRVSSHState *s, BlockDriverState *bs, goto again; } if (r < 0) { - sftp_error_report(s, "write failed"); + sftp_error_trace(s, "write"); s->offset = -1; return -EIO; } @@ -1186,7 +1174,7 @@ static coroutine_fn int ssh_flush(BDRVSSHState *s, BlockDriverState *bs) return 0; } if (r < 0) { - sftp_error_report(s, "fsync failed"); + sftp_error_trace(s, "fsync"); return -EIO; } diff --git a/block/trace-events b/block/trace-events index 4c69548..23c9963 100644 --- a/block/trace-events +++ b/block/trace-events @@ -167,3 +167,6 @@ ssh_write(int64_t offset, size_t size) "offset=%" PRIi64 " size=%zu" ssh_write_buf(void *buf, size_t size) "sftp_write buf=%p size=%zu" ssh_write_return(ssize_t ret) "sftp_write returned %zd" ssh_seek(int64_t offset) "seeking to offset=%" PRIi64 + +# ssh.c +sftp_error(const char *op, const char *ssh_err, int ssh_err_code, unsigned long sftp_err_code) "%s failed: %s (libssh2 error code: %d, sftp error code: %lu)" -- 1.8.3.1