mirror of https://github.com/xemu-project/xemu.git
bdrv_query_image_info Error parameter added
Inform a user in case qcow2_get_specific_info fails to obtain QCOW2 image specific information. This patch is preliminary to the one "qcow2: Add list of bitmaps to ImageInfoSpecificQCow2". Signed-off-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <1549638368-530182-2-git-send-email-andrey.shinkevich@virtuozzo.com> Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
269ee27e99
commit
1bf6e9ca92
5
block.c
5
block.c
|
@ -4462,11 +4462,12 @@ int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
|
||||||
return drv->bdrv_get_info(bs, bdi);
|
return drv->bdrv_get_info(bs, bdi);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs)
|
ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs,
|
||||||
|
Error **errp)
|
||||||
{
|
{
|
||||||
BlockDriver *drv = bs->drv;
|
BlockDriver *drv = bs->drv;
|
||||||
if (drv && drv->bdrv_get_specific_info) {
|
if (drv && drv->bdrv_get_specific_info) {
|
||||||
return drv->bdrv_get_specific_info(bs);
|
return drv->bdrv_get_specific_info(bs, errp);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -594,20 +594,17 @@ static int block_crypto_get_info_luks(BlockDriverState *bs,
|
||||||
}
|
}
|
||||||
|
|
||||||
static ImageInfoSpecific *
|
static ImageInfoSpecific *
|
||||||
block_crypto_get_specific_info_luks(BlockDriverState *bs)
|
block_crypto_get_specific_info_luks(BlockDriverState *bs, Error **errp)
|
||||||
{
|
{
|
||||||
BlockCrypto *crypto = bs->opaque;
|
BlockCrypto *crypto = bs->opaque;
|
||||||
ImageInfoSpecific *spec_info;
|
ImageInfoSpecific *spec_info;
|
||||||
QCryptoBlockInfo *info;
|
QCryptoBlockInfo *info;
|
||||||
|
|
||||||
info = qcrypto_block_get_info(crypto->block, NULL);
|
info = qcrypto_block_get_info(crypto->block, errp);
|
||||||
if (!info) {
|
if (!info) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (info->format != Q_CRYPTO_BLOCK_FORMAT_LUKS) {
|
assert(info->format == Q_CRYPTO_BLOCK_FORMAT_LUKS);
|
||||||
qapi_free_QCryptoBlockInfo(info);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
spec_info = g_new(ImageInfoSpecific, 1);
|
spec_info = g_new(ImageInfoSpecific, 1);
|
||||||
spec_info->type = IMAGE_INFO_SPECIFIC_KIND_LUKS;
|
spec_info->type = IMAGE_INFO_SPECIFIC_KIND_LUKS;
|
||||||
|
|
|
@ -282,7 +282,12 @@ void bdrv_query_image_info(BlockDriverState *bs,
|
||||||
info->dirty_flag = bdi.is_dirty;
|
info->dirty_flag = bdi.is_dirty;
|
||||||
info->has_dirty_flag = true;
|
info->has_dirty_flag = true;
|
||||||
}
|
}
|
||||||
info->format_specific = bdrv_get_specific_info(bs);
|
info->format_specific = bdrv_get_specific_info(bs, &err);
|
||||||
|
if (err) {
|
||||||
|
error_propagate(errp, err);
|
||||||
|
qapi_free_ImageInfo(info);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
info->has_format_specific = info->format_specific != NULL;
|
info->has_format_specific = info->format_specific != NULL;
|
||||||
|
|
||||||
backing_filename = bs->backing_file;
|
backing_filename = bs->backing_file;
|
||||||
|
|
|
@ -4368,14 +4368,20 @@ static int qcow2_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs)
|
static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs,
|
||||||
|
Error **errp)
|
||||||
{
|
{
|
||||||
BDRVQcow2State *s = bs->opaque;
|
BDRVQcow2State *s = bs->opaque;
|
||||||
ImageInfoSpecific *spec_info;
|
ImageInfoSpecific *spec_info;
|
||||||
QCryptoBlockInfo *encrypt_info = NULL;
|
QCryptoBlockInfo *encrypt_info = NULL;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
if (s->crypto != NULL) {
|
if (s->crypto != NULL) {
|
||||||
encrypt_info = qcrypto_block_get_info(s->crypto, &error_abort);
|
encrypt_info = qcrypto_block_get_info(s->crypto, &local_err);
|
||||||
|
if (local_err) {
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
spec_info = g_new(ImageInfoSpecific, 1);
|
spec_info = g_new(ImageInfoSpecific, 1);
|
||||||
|
|
|
@ -2543,7 +2543,8 @@ static int coroutine_fn vmdk_co_check(BlockDriverState *bs,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ImageInfoSpecific *vmdk_get_specific_info(BlockDriverState *bs)
|
static ImageInfoSpecific *vmdk_get_specific_info(BlockDriverState *bs,
|
||||||
|
Error **errp)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
BDRVVmdkState *s = bs->opaque;
|
BDRVVmdkState *s = bs->opaque;
|
||||||
|
|
|
@ -478,7 +478,8 @@ const char *bdrv_get_device_name(const BlockDriverState *bs);
|
||||||
const char *bdrv_get_device_or_node_name(const BlockDriverState *bs);
|
const char *bdrv_get_device_or_node_name(const BlockDriverState *bs);
|
||||||
int bdrv_get_flags(BlockDriverState *bs);
|
int bdrv_get_flags(BlockDriverState *bs);
|
||||||
int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi);
|
int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi);
|
||||||
ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs);
|
ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs,
|
||||||
|
Error **errp);
|
||||||
void bdrv_round_to_clusters(BlockDriverState *bs,
|
void bdrv_round_to_clusters(BlockDriverState *bs,
|
||||||
int64_t offset, int64_t bytes,
|
int64_t offset, int64_t bytes,
|
||||||
int64_t *cluster_offset,
|
int64_t *cluster_offset,
|
||||||
|
|
|
@ -319,7 +319,8 @@ struct BlockDriver {
|
||||||
const char *name,
|
const char *name,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
int (*bdrv_get_info)(BlockDriverState *bs, BlockDriverInfo *bdi);
|
int (*bdrv_get_info)(BlockDriverState *bs, BlockDriverInfo *bdi);
|
||||||
ImageInfoSpecific *(*bdrv_get_specific_info)(BlockDriverState *bs);
|
ImageInfoSpecific *(*bdrv_get_specific_info)(BlockDriverState *bs,
|
||||||
|
Error **errp);
|
||||||
|
|
||||||
int coroutine_fn (*bdrv_save_vmstate)(BlockDriverState *bs,
|
int coroutine_fn (*bdrv_save_vmstate)(BlockDriverState *bs,
|
||||||
QEMUIOVector *qiov,
|
QEMUIOVector *qiov,
|
||||||
|
|
|
@ -1661,6 +1661,7 @@ static int info_f(BlockBackend *blk, int argc, char **argv)
|
||||||
BlockDriverState *bs = blk_bs(blk);
|
BlockDriverState *bs = blk_bs(blk);
|
||||||
BlockDriverInfo bdi;
|
BlockDriverInfo bdi;
|
||||||
ImageInfoSpecific *spec_info;
|
ImageInfoSpecific *spec_info;
|
||||||
|
Error *local_err = NULL;
|
||||||
char s1[64], s2[64];
|
char s1[64], s2[64];
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -1682,7 +1683,11 @@ static int info_f(BlockBackend *blk, int argc, char **argv)
|
||||||
printf("cluster size: %s\n", s1);
|
printf("cluster size: %s\n", s1);
|
||||||
printf("vm state offset: %s\n", s2);
|
printf("vm state offset: %s\n", s2);
|
||||||
|
|
||||||
spec_info = bdrv_get_specific_info(bs);
|
spec_info = bdrv_get_specific_info(bs, &local_err);
|
||||||
|
if (local_err) {
|
||||||
|
error_report_err(local_err);
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
if (spec_info) {
|
if (spec_info) {
|
||||||
printf("Format specific information:\n");
|
printf("Format specific information:\n");
|
||||||
bdrv_image_info_specific_dump(fprintf, stdout, spec_info);
|
bdrv_image_info_specific_dump(fprintf, stdout, spec_info);
|
||||||
|
|
Loading…
Reference in New Issue