block/ssh: Do not report read/write/flush errors to the user

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>
This commit is contained in:
Markus Armbruster 2019-04-17 21:06:28 +02:00
parent e9e1d92d1d
commit 6b3048cee0
2 changed files with 16 additions and 25 deletions

View file

@ -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;
char *ssh_err;
int ssh_err_code;
unsigned long sftp_err_code;
va_start(args, fs);
error_vprintf(fs, args);
/* 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);
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);
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;
}
@ -1188,7 +1176,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;
}