block: Don't throw away errno via error_setg
There are a handful of places in the block layer where a failure path has a valid -errno value, yet error_setg() is used. Those instances should instead use error_setg_errno(), to preserve as much error information as possible. This patch replaces those instances with error_setg_errno(), so that errno is passed up the stack in the error message. Reported-By: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Jeff Cody <jcody@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
28f106afb3
commit
39a611a3e0
@ -633,6 +633,7 @@ void commit_active_start(BlockDriverState *bs, BlockDriverState *base,
|
|||||||
{
|
{
|
||||||
int64_t length, base_length;
|
int64_t length, base_length;
|
||||||
int orig_base_flags;
|
int orig_base_flags;
|
||||||
|
int ret;
|
||||||
|
|
||||||
orig_base_flags = bdrv_get_flags(base);
|
orig_base_flags = bdrv_get_flags(base);
|
||||||
|
|
||||||
@ -642,19 +643,23 @@ void commit_active_start(BlockDriverState *bs, BlockDriverState *base,
|
|||||||
|
|
||||||
length = bdrv_getlength(bs);
|
length = bdrv_getlength(bs);
|
||||||
if (length < 0) {
|
if (length < 0) {
|
||||||
error_setg(errp, "Unable to determine length of %s", bs->filename);
|
error_setg_errno(errp, -length,
|
||||||
|
"Unable to determine length of %s", bs->filename);
|
||||||
goto error_restore_flags;
|
goto error_restore_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
base_length = bdrv_getlength(base);
|
base_length = bdrv_getlength(base);
|
||||||
if (base_length < 0) {
|
if (base_length < 0) {
|
||||||
error_setg(errp, "Unable to determine length of %s", base->filename);
|
error_setg_errno(errp, -base_length,
|
||||||
|
"Unable to determine length of %s", base->filename);
|
||||||
goto error_restore_flags;
|
goto error_restore_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (length > base_length) {
|
if (length > base_length) {
|
||||||
if (bdrv_truncate(base, length) < 0) {
|
ret = bdrv_truncate(base, length);
|
||||||
error_setg(errp, "Top image %s is larger than base image %s, and "
|
if (ret < 0) {
|
||||||
|
error_setg_errno(errp, -ret,
|
||||||
|
"Top image %s is larger than base image %s, and "
|
||||||
"resize of base image failed",
|
"resize of base image failed",
|
||||||
bs->filename, base->filename);
|
bs->filename, base->filename);
|
||||||
goto error_restore_flags;
|
goto error_restore_flags;
|
||||||
|
@ -606,7 +606,8 @@ int qcow2_snapshot_delete(BlockDriverState *bs,
|
|||||||
s->nb_snapshots--;
|
s->nb_snapshots--;
|
||||||
ret = qcow2_write_snapshots(bs);
|
ret = qcow2_write_snapshots(bs);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_setg(errp, "Failed to remove snapshot from snapshot list");
|
error_setg_errno(errp, -ret,
|
||||||
|
"Failed to remove snapshot from snapshot list");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -624,7 +625,7 @@ int qcow2_snapshot_delete(BlockDriverState *bs,
|
|||||||
ret = qcow2_update_snapshot_refcount(bs, sn.l1_table_offset,
|
ret = qcow2_update_snapshot_refcount(bs, sn.l1_table_offset,
|
||||||
sn.l1_size, -1);
|
sn.l1_size, -1);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_setg(errp, "Failed to free the cluster and L1 table");
|
error_setg_errno(errp, -ret, "Failed to free the cluster and L1 table");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
qcow2_free_clusters(bs, sn.l1_table_offset, sn.l1_size * sizeof(uint64_t),
|
qcow2_free_clusters(bs, sn.l1_table_offset, sn.l1_size * sizeof(uint64_t),
|
||||||
@ -633,7 +634,8 @@ int qcow2_snapshot_delete(BlockDriverState *bs,
|
|||||||
/* must update the copied flag on the current cluster offsets */
|
/* must update the copied flag on the current cluster offsets */
|
||||||
ret = qcow2_update_snapshot_refcount(bs, s->l1_table_offset, s->l1_size, 0);
|
ret = qcow2_update_snapshot_refcount(bs, s->l1_table_offset, s->l1_size, 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_setg(errp, "Failed to update snapshot status in disk");
|
error_setg_errno(errp, -ret,
|
||||||
|
"Failed to update snapshot status in disk");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1502,7 +1502,7 @@ static int vmdk_create_extent(const char *filename, int64_t filesize,
|
|||||||
if (flat) {
|
if (flat) {
|
||||||
ret = bdrv_truncate(bs, filesize);
|
ret = bdrv_truncate(bs, filesize);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_setg(errp, "Could not truncate file");
|
error_setg_errno(errp, -ret, "Could not truncate file");
|
||||||
}
|
}
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
@ -1562,7 +1562,7 @@ static int vmdk_create_extent(const char *filename, int64_t filesize,
|
|||||||
|
|
||||||
ret = bdrv_truncate(bs, le64_to_cpu(header.grain_offset) << 9);
|
ret = bdrv_truncate(bs, le64_to_cpu(header.grain_offset) << 9);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_setg(errp, "Could not truncate file");
|
error_setg_errno(errp, -ret, "Could not truncate file");
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1846,7 +1846,7 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options,
|
|||||||
if (desc_offset == 0) {
|
if (desc_offset == 0) {
|
||||||
ret = bdrv_truncate(new_bs, desc_len);
|
ret = bdrv_truncate(new_bs, desc_len);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_setg(errp, "Could not truncate file");
|
error_setg_errno(errp, -ret, "Could not truncate file");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
exit:
|
exit:
|
||||||
|
Loading…
Reference in New Issue
Block a user