block/ssh: Propagate errors to open and create methods

Completes the conversion to Error started in commit 015a103^..d5124c0.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Markus Armbruster 2014-05-16 11:00:16 +02:00 committed by Stefan Hajnoczi
parent 5f0c39e598
commit 5496fb1aeb
1 changed files with 22 additions and 25 deletions

View File

@ -131,29 +131,34 @@ session_error_setg(Error **errp, BDRVSSHState *s, const char *fs, ...)
g_free(msg); g_free(msg);
} }
/* Wrappers around error_report which make sure to dump as much static void GCC_FMT_ATTR(3, 4)
* information from libssh2 as possible. sftp_error_setg(Error **errp, BDRVSSHState *s, const char *fs, ...)
*/
static void GCC_FMT_ATTR(2, 3)
session_error_report(BDRVSSHState *s, const char *fs, ...)
{ {
va_list args; va_list args;
char *msg;
va_start(args, fs); va_start(args, fs);
error_vprintf(fs, args); msg = g_strdup_vprintf(fs, args);
va_end(args);
if ((s)->session) { if (s->sftp) {
char *ssh_err; char *ssh_err;
int ssh_err_code; int ssh_err_code;
unsigned long sftp_err_code;
/* This is not an errno. See <libssh2.h>. */ /* This is not an errno. See <libssh2.h>. */
ssh_err_code = libssh2_session_last_error(s->session, ssh_err_code = libssh2_session_last_error(s->session,
&ssh_err, NULL, 0); &ssh_err, NULL, 0);
error_printf(": %s (libssh2 error code: %d)", ssh_err, ssh_err_code); /* See <libssh2_sftp.h>. */
} sftp_err_code = libssh2_sftp_last_error((s)->sftp);
va_end(args); error_setg(errp,
error_printf("\n"); "%s: %s (libssh2 error code: %d, sftp error code: %lu)",
msg, ssh_err, ssh_err_code, sftp_err_code);
} else {
error_setg(errp, "%s", msg);
}
g_free(msg);
} }
static void GCC_FMT_ATTR(2, 3) static void GCC_FMT_ATTR(2, 3)
@ -594,14 +599,14 @@ static int connect_to_ssh(BDRVSSHState *s, QDict *options,
path, ssh_flags, creat_mode); path, ssh_flags, creat_mode);
s->sftp_handle = libssh2_sftp_open(s->sftp, path, ssh_flags, creat_mode); s->sftp_handle = libssh2_sftp_open(s->sftp, path, ssh_flags, creat_mode);
if (!s->sftp_handle) { if (!s->sftp_handle) {
session_error_report(s, "failed to open remote file '%s'", path); session_error_setg(errp, s, "failed to open remote file '%s'", path);
ret = -EINVAL; ret = -EINVAL;
goto err; goto err;
} }
r = libssh2_sftp_fstat(s->sftp_handle, &s->attrs); r = libssh2_sftp_fstat(s->sftp_handle, &s->attrs);
if (r < 0) { if (r < 0) {
sftp_error_report(s, "failed to read file attributes"); sftp_error_setg(errp, s, "failed to read file attributes");
return -EINVAL; return -EINVAL;
} }
@ -639,7 +644,6 @@ static int connect_to_ssh(BDRVSSHState *s, QDict *options,
static int ssh_file_open(BlockDriverState *bs, QDict *options, int bdrv_flags, static int ssh_file_open(BlockDriverState *bs, QDict *options, int bdrv_flags,
Error **errp) Error **errp)
{ {
Error *local_err = NULL;
BDRVSSHState *s = bs->opaque; BDRVSSHState *s = bs->opaque;
int ret; int ret;
int ssh_flags; int ssh_flags;
@ -652,10 +656,8 @@ static int ssh_file_open(BlockDriverState *bs, QDict *options, int bdrv_flags,
} }
/* Start up SSH. */ /* Start up SSH. */
ret = connect_to_ssh(s, options, ssh_flags, 0, &local_err); ret = connect_to_ssh(s, options, ssh_flags, 0, errp);
if (ret < 0) { if (ret < 0) {
qerror_report_err(local_err);
error_free(local_err);
goto err; goto err;
} }
@ -686,7 +688,6 @@ static int ssh_create(const char *filename, QEMUOptionParameter *options,
Error **errp) Error **errp)
{ {
int r, ret; int r, ret;
Error *local_err = NULL;
int64_t total_size = 0; int64_t total_size = 0;
QDict *uri_options = NULL; QDict *uri_options = NULL;
BDRVSSHState s; BDRVSSHState s;
@ -705,10 +706,8 @@ static int ssh_create(const char *filename, QEMUOptionParameter *options,
DPRINTF("total_size=%" PRIi64, total_size); DPRINTF("total_size=%" PRIi64, total_size);
uri_options = qdict_new(); uri_options = qdict_new();
r = parse_uri(filename, uri_options, &local_err); r = parse_uri(filename, uri_options, errp);
if (r < 0) { if (r < 0) {
qerror_report_err(local_err);
error_free(local_err);
ret = r; ret = r;
goto out; goto out;
} }
@ -716,10 +715,8 @@ static int ssh_create(const char *filename, QEMUOptionParameter *options,
r = connect_to_ssh(&s, uri_options, r = connect_to_ssh(&s, uri_options,
LIBSSH2_FXF_READ|LIBSSH2_FXF_WRITE| LIBSSH2_FXF_READ|LIBSSH2_FXF_WRITE|
LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC, LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC,
0644, &local_err); 0644, errp);
if (r < 0) { if (r < 0) {
qerror_report_err(local_err);
error_free(local_err);
ret = r; ret = r;
goto out; goto out;
} }
@ -728,7 +725,7 @@ static int ssh_create(const char *filename, QEMUOptionParameter *options,
libssh2_sftp_seek64(s.sftp_handle, total_size-1); libssh2_sftp_seek64(s.sftp_handle, total_size-1);
r2 = libssh2_sftp_write(s.sftp_handle, c, 1); r2 = libssh2_sftp_write(s.sftp_handle, c, 1);
if (r2 < 0) { if (r2 < 0) {
sftp_error_report(&s, "truncate failed"); sftp_error_setg(errp, &s, "truncate failed");
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
} }