[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 02/17] block: Pass local error object pointer to err
From: |
Greg Kurz |
Subject: |
[Qemu-devel] [PATCH 02/17] block: Pass local error object pointer to error_append_hint() |
Date: |
Tue, 17 Sep 2019 12:20:43 +0200 |
User-agent: |
StGit/unknown-version |
Ensure that hints are added even if errp is &error_fatal or &error_abort.
Signed-off-by: Greg Kurz <address@hidden>
---
block/backup.c | 7 +++++--
block/dirty-bitmap.c | 7 +++++--
block/file-posix.c | 20 +++++++++++++-------
block/gluster.c | 23 +++++++++++++++--------
block/qcow.c | 10 ++++++----
block/qcow2.c | 7 +++++--
block/vhdx-log.c | 7 +++++--
block/vpc.c | 7 +++++--
8 files changed, 59 insertions(+), 29 deletions(-)
diff --git a/block/backup.c b/block/backup.c
index 763f0d7ff6db..d8c422a0e3bc 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -602,11 +602,14 @@ static int64_t
backup_calculate_cluster_size(BlockDriverState *target,
BACKUP_CLUSTER_SIZE_DEFAULT);
return BACKUP_CLUSTER_SIZE_DEFAULT;
} else if (ret < 0 && !target->backing) {
- error_setg_errno(errp, -ret,
+ Error *local_err = NULL;
+
+ error_setg_errno(&local_err, -ret,
"Couldn't determine the cluster size of the target image, "
"which has no backing file");
- error_append_hint(errp,
+ error_append_hint(&local_err,
"Aborting, since this may create an unusable destination image\n");
+ error_propagate(errp, local_err);
return ret;
} else if (ret < 0 && target->backing) {
/* Not fatal; just trudge on ahead. */
diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
index 134e0c9a0c8f..b31017a77d51 100644
--- a/block/dirty-bitmap.c
+++ b/block/dirty-bitmap.c
@@ -251,10 +251,13 @@ int bdrv_dirty_bitmap_check(const BdrvDirtyBitmap
*bitmap, uint32_t flags,
if ((flags & BDRV_BITMAP_INCONSISTENT) &&
bdrv_dirty_bitmap_inconsistent(bitmap)) {
- error_setg(errp, "Bitmap '%s' is inconsistent and cannot be used",
+ Error *local_err = NULL;
+
+ error_setg(&local_err, "Bitmap '%s' is inconsistent and cannot be
used",
bitmap->name);
- error_append_hint(errp, "Try block-dirty-bitmap-remove to delete"
+ error_append_hint(&local_err, "Try block-dirty-bitmap-remove to delete"
" this bitmap from disk");
+ error_propagate(errp, local_err);
return -1;
}
diff --git a/block/file-posix.c b/block/file-posix.c
index f12c06de2df5..9a95f7e94123 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -389,8 +389,11 @@ static void raw_probe_alignment(BlockDriverState *bs, int
fd, Error **errp)
}
if (!s->buf_align || !bs->bl.request_alignment) {
- error_setg(errp, "Could not find working O_DIRECT alignment");
- error_append_hint(errp, "Try cache.direct=off\n");
+ Error *local_err = NULL;
+
+ error_setg(&local_err, "Could not find working O_DIRECT alignment");
+ error_append_hint(&local_err, "Try cache.direct=off\n");
+ error_propagate(errp, local_err);
}
}
@@ -845,16 +848,18 @@ static int raw_handle_perm_lock(BlockDriverState *bs,
}
ret = raw_apply_lock_bytes(s, s->fd, s->perm | new_perm,
~s->shared_perm | ~new_shared,
- false, errp);
+ false, &local_err);
if (!ret) {
- ret = raw_check_lock_bytes(s->fd, new_perm, new_shared, errp);
+ ret = raw_check_lock_bytes(s->fd, new_perm, new_shared,
&local_err);
if (!ret) {
return 0;
}
- error_append_hint(errp,
+ error_append_hint(&local_err,
"Is another process using the image [%s]?\n",
bs->filename);
}
+ error_propagate(errp, local_err);
+ local_err = NULL; /* for fall through */
op = RAW_PL_ABORT;
/* fall through to unlock bytes. */
case RAW_PL_ABORT:
@@ -2277,11 +2282,12 @@ raw_co_create(BlockdevCreateOptions *options, Error
**errp)
}
/* Step two: Check that nobody else has taken conflicting locks */
- result = raw_check_lock_bytes(fd, perm, shared, errp);
+ result = raw_check_lock_bytes(fd, perm, shared, &local_err);
if (result < 0) {
- error_append_hint(errp,
+ error_append_hint(&local_err,
"Is another process using the image [%s]?\n",
file_opts->filename);
+ error_propagate(errp, local_err);
goto out_unlock;
}
diff --git a/block/gluster.c b/block/gluster.c
index 64028b2cba30..dce42884f97c 100644
--- a/block/gluster.c
+++ b/block/gluster.c
@@ -473,26 +473,29 @@ static struct glfs
*qemu_gluster_glfs_init(BlockdevOptionsGluster *gconf,
ret = glfs_init(glfs);
if (ret) {
- error_setg(errp, "Gluster connection for volume %s, path %s failed"
+ Error *local_err = NULL;
+
+ error_setg(&local_err, "Gluster connection for volume %s, path %s
failed"
" to connect", gconf->volume, gconf->path);
for (server = gconf->server; server; server = server->next) {
if (server->value->type == SOCKET_ADDRESS_TYPE_UNIX) {
- error_append_hint(errp, "hint: failed on socket %s ",
+ error_append_hint(&local_err, "hint: failed on socket %s ",
server->value->u.q_unix.path);
} else {
- error_append_hint(errp, "hint: failed on host %s and port %s ",
+ error_append_hint(&local_err, "hint: failed on host %s and
port %s ",
server->value->u.inet.host,
server->value->u.inet.port);
}
}
- error_append_hint(errp, "Please refer to gluster logs for more
info\n");
+ error_append_hint(&local_err, "Please refer to gluster logs for more
info\n");
/* glfs_init sometimes doesn't set errno although docs suggest that */
if (errno == 0) {
errno = EINVAL;
}
+ error_propagate(errp, local_err);
goto out;
}
return glfs;
@@ -695,20 +698,23 @@ static int qemu_gluster_parse(BlockdevOptionsGluster
*gconf,
QDict *options, Error **errp)
{
int ret;
+ Error *local_err = NULL;
+
if (filename) {
ret = qemu_gluster_parse_uri(gconf, filename);
if (ret < 0) {
- error_setg(errp, "invalid URI %s", filename);
- error_append_hint(errp, "Usage: file=gluster[+transport]://"
+ error_setg(&local_err, "invalid URI %s", filename);
+ error_append_hint(&local_err, "Usage: file=gluster[+transport]://"
"[host[:port]]volume/path[?socket=...]"
"[,file.debug=N]"
"[,file.logfile=/path/filename.log]\n");
+ error_propagate(errp, local_err);
return ret;
}
} else {
- ret = qemu_gluster_parse_json(gconf, options, errp);
+ ret = qemu_gluster_parse_json(gconf, options, &local_err);
if (ret < 0) {
- error_append_hint(errp, "Usage: "
+ error_append_hint(&local_err, "Usage: "
"-drive driver=qcow2,file.driver=gluster,"
"file.volume=testvol,file.path=/path/a.qcow2"
"[,file.debug=9]"
@@ -719,6 +725,7 @@ static int qemu_gluster_parse(BlockdevOptionsGluster *gconf,
"file.server.1.transport=unix,"
"file.server.1.path=/var/run/glusterd.socket ..."
"\n");
+ error_propagate(errp, local_err);
return ret;
}
}
diff --git a/block/qcow.c b/block/qcow.c
index 5bdf72ba33ce..9049573b52b2 100644
--- a/block/qcow.c
+++ b/block/qcow.c
@@ -156,11 +156,12 @@ static int qcow_open(BlockDriverState *bs, QDict
*options, int flags,
goto fail;
}
if (header.version != QCOW_VERSION) {
- error_setg(errp, "qcow (v%d) does not support qcow version %" PRIu32,
+ error_setg(&local_err, "qcow (v%d) does not support qcow version %"
PRIu32,
QCOW_VERSION, header.version);
if (header.version == 2 || header.version == 3) {
- error_append_hint(errp, "Try the 'qcow2' driver instead.\n");
+ error_append_hint(&local_err, "Try the 'qcow2' driver instead.\n");
}
+ error_propagate(errp, local_err);
ret = -ENOTSUP;
goto fail;
@@ -189,14 +190,15 @@ static int qcow_open(BlockDriverState *bs, QDict
*options, int flags,
if (s->crypt_method_header) {
if (bdrv_uses_whitelist() &&
s->crypt_method_header == QCOW_CRYPT_AES) {
- error_setg(errp,
+ error_setg(&local_err,
"Use of AES-CBC encrypted qcow images is no longer "
"supported in system emulators");
- error_append_hint(errp,
+ error_append_hint(&local_err,
"You can use 'qemu-img convert' to convert your "
"image to an alternative supported format, such "
"as unencrypted qcow, or raw with the LUKS "
"format instead.\n");
+ error_propagate(errp, local_err);
ret = -ENOSYS;
goto fail;
}
diff --git a/block/qcow2.c b/block/qcow2.c
index 57734f20cf8d..2c52139b7385 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -1357,14 +1357,17 @@ static int coroutine_fn qcow2_do_open(BlockDriverState
*bs, QDict *options,
if (s->crypt_method_header) {
if (bdrv_uses_whitelist() &&
s->crypt_method_header == QCOW_CRYPT_AES) {
- error_setg(errp,
+ Error *local_err = NULL;
+
+ error_setg(&local_err,
"Use of AES-CBC encrypted qcow2 images is no longer "
"supported in system emulators");
- error_append_hint(errp,
+ error_append_hint(&local_err,
"You can use 'qemu-img convert' to convert your "
"image to an alternative supported format, such "
"as unencrypted qcow2, or raw with the LUKS "
"format instead.\n");
+ error_propagate(errp, local_err);
ret = -ENOSYS;
goto fail;
}
diff --git a/block/vhdx-log.c b/block/vhdx-log.c
index fdd3a7adc378..9f4de9cbcdb6 100644
--- a/block/vhdx-log.c
+++ b/block/vhdx-log.c
@@ -802,15 +802,18 @@ int vhdx_parse_log(BlockDriverState *bs, BDRVVHDXState
*s, bool *flushed,
if (logs.valid) {
if (bs->read_only) {
+ Error *local_err = NULL;
+
bdrv_refresh_filename(bs);
ret = -EPERM;
- error_setg(errp,
+ error_setg(&local_err,
"VHDX image file '%s' opened read-only, but "
"contains a log that needs to be replayed",
bs->filename);
- error_append_hint(errp, "To replay the log, run:\n"
+ error_append_hint(&local_err, "To replay the log, run:\n"
"qemu-img check -r all '%s'\n",
bs->filename);
+ error_propagate(errp, local_err);
goto exit;
}
/* now flush the log */
diff --git a/block/vpc.c b/block/vpc.c
index 5cd38907808b..facd7cdb2c98 100644
--- a/block/vpc.c
+++ b/block/vpc.c
@@ -1028,12 +1028,15 @@ static int coroutine_fn
vpc_co_create(BlockdevCreateOptions *opts,
}
if (total_size != total_sectors * BDRV_SECTOR_SIZE) {
- error_setg(errp, "The requested image size cannot be represented in "
+ Error *local_err = NULL;
+
+ error_setg(&local_err, "The requested image size cannot be represented
in "
"CHS geometry");
- error_append_hint(errp, "Try size=%llu or force-size=on (the "
+ error_append_hint(&local_err, "Try size=%llu or force-size=on (the "
"latter makes the image incompatible with "
"Virtual PC)",
total_sectors * BDRV_SECTOR_SIZE);
+ error_propagate(errp, local_err);
ret = -EINVAL;
goto out;
}
Re: [Qemu-devel] [PATCH 02/17] block: Pass local error object pointer to error_append_hint(), Eric Blake, 2019/09/17