Patchwork [v2,2/5] block: Use error code EMEDIUMTYPE for wrong format in some block drivers

login
register
mail settings
Submitter Markus Armbruster
Date Jan. 18, 2013, 8:53 a.m.
Message ID <871udizxb5.fsf@blackfin.pond.sub.org>
Download mbox | patch
Permalink /patch/213525/
State New
Headers show

Comments

Markus Armbruster - Jan. 18, 2013, 8:53 a.m.
Stefan Weil <sw@weilnetz.de> writes:

> This improves error reports for bochs, cow, qcow, qcow2, qed and vmdk
> when a file with the wrong format is selected.
>
> Signed-off-by: Stefan Weil <sw@weilnetz.de>
> ---
>  block/bochs.c |    2 +-
>  block/cow.c   |    2 +-
>  block/qcow.c  |    2 +-
>  block/qcow2.c |    2 +-
>  block/qed.c   |    2 +-
>  block/vmdk.c  |    4 ++--
>  6 files changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/block/bochs.c b/block/bochs.c
> index 1b1d9cd..3737583 100644
> --- a/block/bochs.c
> +++ b/block/bochs.c
> @@ -126,7 +126,7 @@ static int bochs_open(BlockDriverState *bs, int flags)
>          strcmp(bochs.subtype, GROWING_TYPE) ||
>  	((le32_to_cpu(bochs.version) != HEADER_VERSION) &&
>  	(le32_to_cpu(bochs.version) != HEADER_V1))) {
> -        goto fail;
> +        return -EMEDIUMTYPE;
>      }
>  
>      if (le32_to_cpu(bochs.version) == HEADER_V1) {

You make the function return either 0, -1 or -EMEDIUMTYPE.  Please make
it return either 0 or a negative errno code, like this (untested):


Same for all the other bdrv_open() methods.
Stefan Weil - Jan. 18, 2013, 6:10 p.m.
Am 18.01.2013 09:53, schrieb Markus Armbruster:
> Stefan Weil <sw@weilnetz.de> writes:
>> This improves error reports for bochs, cow, qcow, qcow2, qed and vmdk
>> when a file with the wrong format is selected.
>>
>> Signed-off-by: Stefan Weil <sw@weilnetz.de>
>> ---
>>  block/bochs.c |    2 +-
>>  block/cow.c   |    2 +-
>>  block/qcow.c  |    2 +-
>>  block/qcow2.c |    2 +-
>>  block/qed.c   |    2 +-
>>  block/vmdk.c  |    4 ++--
>>  6 files changed, 7 insertions(+), 7 deletions(-)
>>
>> diff --git a/block/bochs.c b/block/bochs.c
>> index 1b1d9cd..3737583 100644
>> --- a/block/bochs.c
>> +++ b/block/bochs.c
>> @@ -126,7 +126,7 @@ static int bochs_open(BlockDriverState *bs, int flags)
>>          strcmp(bochs.subtype, GROWING_TYPE) ||
>>  	((le32_to_cpu(bochs.version) != HEADER_VERSION) &&
>>  	(le32_to_cpu(bochs.version) != HEADER_V1))) {
>> -        goto fail;
>> +        return -EMEDIUMTYPE;
>>      }
>>  
>>      if (le32_to_cpu(bochs.version) == HEADER_V1) {
> You make the function return either 0, -1 or -EMEDIUMTYPE.  Please make
> it return either 0 or a negative errno code, like this (untested):

Hi Markus,

returning 0, -1 is like before, only returning -EMEDIUMTYPE is new.

You are right, a return value of -1 should be replaced by a negative
error value. I fixed this for block/vdi.c in a separate patch as
suggested by Kevin, see http://patchwork.ozlabs.org/patch/213375/.

The same kind of improvement should be done for other block
drivers which currently use -1, but that can be done after my
patch series was applied.

The primary purpose of my patch series was fixing open bugreports.
For vdi I did more because I feel responsible for that part of the
code.

Regards,
StefanW.

Patch

diff --git a/block/bochs.c b/block/bochs.c
index 1b1d9cd..a9eb338 100644
--- a/block/bochs.c
+++ b/block/bochs.c
@@ -111,14 +111,15 @@  static int bochs_probe(const uint8_t *buf, int buf_size, const char *filename)
 static int bochs_open(BlockDriverState *bs, int flags)
 {
     BDRVBochsState *s = bs->opaque;
-    int i;
+    int ret, i;
     struct bochs_header bochs;
     struct bochs_header_v1 header_v1;
 
     bs->read_only = 1; // no write support yet
 
-    if (bdrv_pread(bs->file, 0, &bochs, sizeof(bochs)) != sizeof(bochs)) {
-        goto fail;
+    ret = bdrv_pread(bs->file, 0, &bochs, sizeof(bochs));
+    if (ret < 0) {
+        return ret;
     }
 
     if (strcmp(bochs.magic, HEADER_MAGIC) ||
@@ -126,7 +127,7 @@  static int bochs_open(BlockDriverState *bs, int flags)
         strcmp(bochs.subtype, GROWING_TYPE) ||
 	((le32_to_cpu(bochs.version) != HEADER_VERSION) &&
 	(le32_to_cpu(bochs.version) != HEADER_V1))) {
-        goto fail;
+        return -EMEDIUMTYPE;
     }
 
     if (le32_to_cpu(bochs.version) == HEADER_V1) {
@@ -138,9 +139,11 @@  static int bochs_open(BlockDriverState *bs, int flags)
 
     s->catalog_size = le32_to_cpu(bochs.extra.redolog.catalog);
     s->catalog_bitmap = g_malloc(s->catalog_size * 4);
-    if (bdrv_pread(bs->file, le32_to_cpu(bochs.header), s->catalog_bitmap,
-                   s->catalog_size * 4) != s->catalog_size * 4)
-	goto fail;
+    ret = bdrv_pread(bs->file, le32_to_cpu(bochs.header), s->catalog_bitmap,
+                     s->catalog_size * 4);
+    if (ret < 0) {
+	return ret;
+    }
     for (i = 0; i < s->catalog_size; i++)
 	le32_to_cpus(&s->catalog_bitmap[i]);
 
@@ -153,8 +156,6 @@  static int bochs_open(BlockDriverState *bs, int flags)
 
     qemu_co_mutex_init(&s->lock);
     return 0;
- fail:
-    return -1;
 }
 
 static int64_t seek_to_sector(BlockDriverState *bs, int64_t sector_num)