qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v3 10/10] block: Avoid bdrv_get_geometry() where


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH v3 10/10] block: Avoid bdrv_get_geometry() where errors should be detected
Date: Mon, 02 Jun 2014 18:49:24 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux)

Benoît Canet <address@hidden> writes:

> The Friday 30 May 2014 à 20:13:51 (+0200), Markus Armbruster wrote :
>> bdrv_get_geometry() hides errors.  Use bdrv_nb_sectors() or
>> bdrv_getlength() instead where that's obviously inappropriate.
>> 
>> Signed-off-by: Markus Armbruster <address@hidden>
>> Reviewed-by: Eric Blake <address@hidden>
>> Reviewed-by: Max Reitz <address@hidden>
>> ---
>>  block.c      | 11 ++++++++---
>>  block/qapi.c | 14 ++++++++++----
>>  qemu-img.c   | 59 
>> +++++++++++++++++++++++++++++++++++++++++++++--------------
>>  3 files changed, 63 insertions(+), 21 deletions(-)
>> 
>> diff --git a/block.c b/block.c
>> index 41837b4..94f8b87 100644
>> --- a/block.c
>> +++ b/block.c
>> @@ -5573,7 +5573,7 @@ void bdrv_img_create(const char *filename, const char 
>> *fmt,
>>      if (size && size->value.n == -1) {
>>          if (backing_file && backing_file->value.s) {
>>              BlockDriverState *bs;
>> -            uint64_t size;
>> +            int64_t size;
>>              char buf[32];
>>              int back_flags;
>>  
>> @@ -5592,8 +5592,13 @@ void bdrv_img_create(const char *filename, const char 
>> *fmt,
>>                  local_err = NULL;
>>                  goto out;
>>              }
>> -            bdrv_get_geometry(bs, &size);
>> -            size *= 512;
>> +            size = bdrv_getlength(bs);
>> +            if (size < 0) {
>> +                error_setg_errno(errp, -size, "Could not get size of '%s'",
>> +                                 backing_file->value.s);
>> +                bdrv_unref(bs);
>> +                goto out;
>> +            }
>>  
>>              snprintf(buf, sizeof(buf), "%" PRId64, size);
>>              set_option_parameter(param, BLOCK_OPT_SIZE, buf);
>> diff --git a/block/qapi.c b/block/qapi.c
>> index 75f44f1..ae6488a 100644
>> --- a/block/qapi.c
>> +++ b/block/qapi.c
>> @@ -165,19 +165,25 @@ void bdrv_query_image_info(BlockDriverState *bs,
>>                             ImageInfo **p_info,
>>                             Error **errp)
>>  {
>> -    uint64_t total_sectors;
>> +    int64_t size;
>>      const char *backing_filename;
>>      char backing_filename2[1024];
>>      BlockDriverInfo bdi;
>>      int ret;
>>      Error *err = NULL;
>> -    ImageInfo *info = g_new0(ImageInfo, 1);
>> +    ImageInfo *info;
>>  
>> -    bdrv_get_geometry(bs, &total_sectors);
>> +    size = bdrv_getlength(bs);
>> +    if (size < 0) {
>> +        error_setg_errno(errp, -size, "Can't get size of device '%s'",
>> +                         bdrv_get_device_name(bs));
>> +        return;
>> +    }
>>  
>> +    info = g_new0(ImageInfo, 1);
>>      info->filename        = g_strdup(bs->filename);
>>      info->format          = g_strdup(bdrv_get_format_name(bs));
>> -    info->virtual_size    = total_sectors * 512;
>> +    info->virtual_size    = size;
>>      info->actual_size     = bdrv_get_allocated_file_size(bs);
>>      info->has_actual_size = info->actual_size >= 0;
>>      if (bdrv_is_encrypted(bs)) {
>> diff --git a/qemu-img.c b/qemu-img.c
>> index 2cb56c5..fca58bc 100644
>> --- a/qemu-img.c
>> +++ b/qemu-img.c
>> @@ -959,7 +959,6 @@ static int img_compare(int argc, char **argv)
>>      int64_t sector_num = 0;
>>      int64_t nb_sectors;
>>      int c, pnum;
>> -    uint64_t bs_sectors;
>>      uint64_t progress_base;
>>  
>>      for (;;) {
>> @@ -1021,10 +1020,18 @@ static int img_compare(int argc, char **argv)
>>  
>>      buf1 = qemu_blockalign(bs1, IO_BUF_SIZE);
>>      buf2 = qemu_blockalign(bs2, IO_BUF_SIZE);
>> -    bdrv_get_geometry(bs1, &bs_sectors);
>> -    total_sectors1 = bs_sectors;
>> -    bdrv_get_geometry(bs2, &bs_sectors);
>> -    total_sectors2 = bs_sectors;
>> +    total_sectors1 = bdrv_nb_sectors(bs1);
>> +    if (total_sectors1 < 0) {
>> +        error_report("Can't get size of %s: %s",
>> +                     filename1, strerror(-total_sectors1));
>> +        goto out;
>> +    }
>> +    total_sectors2 = bdrv_nb_sectors(bs2);
>> +    if (total_sectors2 < 0) {
>> +        error_report("Can't get size of %s: %s",
>> +                     filename2, strerror(-total_sectors2));
>> +        goto out;
>> +    }
> Would setting ret be useful beforie goto out ? 

Yes, to a value > 1.  But which one?  We use 2, 3 and 4, but their
documented only as ">1 - Error occured".

>>      total_sectors = MIN(total_sectors1, total_sectors2);
>>      progress_base = MAX(total_sectors1, total_sectors2);
>>  
[...]

Thanks!



reply via email to

[Prev in Thread] Current Thread [Next in Thread]