133 lines
4.7 KiB
Diff
133 lines
4.7 KiB
Diff
|
From 2deb556f99ae439125674fa3c6d77424048fd30c Mon Sep 17 00:00:00 2001
|
||
|
From: Pino Toscano <ptoscano@redhat.com>
|
||
|
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 <ptoscano@redhat.com>
|
||
|
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é <philmd@redhat.com>
|
||
|
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||
|
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||
|
RH-Acked-by: Markus Armbruster <armbru@redhat.com>
|
||
|
|
||
|
From: Markus Armbruster <armbru@redhat.com>
|
||
|
|
||
|
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" <rjones@redhat.com>
|
||
|
Cc: Kevin Wolf <kwolf@redhat.com>
|
||
|
Cc: Max Reitz <mreitz@redhat.com>
|
||
|
Cc: qemu-block@nongnu.org
|
||
|
Signed-off-by: Markus Armbruster <armbru@redhat.com>
|
||
|
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||
|
Message-Id: <20190417190641.26814-3-armbru@redhat.com>
|
||
|
(cherry picked from commit 6b3048cee0e0eccd27b62954ecc57c4a1bceb976)
|
||
|
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||
|
---
|
||
|
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 <libssh2.h>. */
|
||
|
+ ssh_err_code = libssh2_session_last_error(s->session,
|
||
|
+ &ssh_err, NULL, 0);
|
||
|
+ /* See <libssh2_sftp.h>. */
|
||
|
+ sftp_err_code = libssh2_sftp_last_error((s)->sftp);
|
||
|
|
||
|
- /* This is not an errno. See <libssh2.h>. */
|
||
|
- ssh_err_code = libssh2_session_last_error(s->session,
|
||
|
- &ssh_err, NULL, 0);
|
||
|
- /* See <libssh2_sftp.h>. */
|
||
|
- 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
|
||
|
|