Patchwork block: Use error codes from lower levels for error message

login
register
mail settings
Submitter Stefan Weil
Date July 18, 2010, 7:42 p.m.
Message ID <1279482150-19385-1-git-send-email-weil@mail.berlios.de>
Download mbox | patch
Permalink /patch/59173/
State New
Headers show

Comments

Stefan Weil - July 18, 2010, 7:42 p.m.
"No such file or directory" is a misleading error message
when a user tries to open a file with wrong permissions.

Cc: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Stefan Weil <weil@mail.berlios.de>
---
 block.c |   12 ++++++++----
 1 files changed, 8 insertions(+), 4 deletions(-)
Kevin Wolf - July 19, 2010, 12:26 p.m.
Am 18.07.2010 21:42, schrieb Stefan Weil:
> "No such file or directory" is a misleading error message
> when a user tries to open a file with wrong permissions.
> 
> Cc: Kevin Wolf <kwolf@redhat.com>
> Signed-off-by: Stefan Weil <weil@mail.berlios.de>
> ---
>  block.c |   12 ++++++++----
>  1 files changed, 8 insertions(+), 4 deletions(-)
> 
> diff --git a/block.c b/block.c
> index f837876..2f80540 100644
> --- a/block.c
> +++ b/block.c
> @@ -330,16 +330,20 @@ BlockDriver *bdrv_find_protocol(const char *filename)
>      return NULL;
>  }
>  
> -static BlockDriver *find_image_format(const char *filename)
> +static BlockDriver *find_image_format(const char *filename, int *error)

Wouldn't it be a more natural interface to return an 0/-errno int and
pass the BlockDriver* by reference? I think we already have some
function that work this way in the block code, but I can't remember any
that get an int *error.

>  {
>      int ret, score, score_max;
>      BlockDriver *drv1, *drv;
>      uint8_t buf[2048];
>      BlockDriverState *bs;
>  
> +    *error = -ENOENT;

Why -ENOENT is the default would be clearer if you moved it down next to
the drv = NULL before the loop that searches for the driver.

Apart from these minor nitpicks it looks good.

Kevin
Stefan Weil - July 19, 2010, 8:55 p.m.
Am 19.07.2010 14:26, schrieb Kevin Wolf:
> Am 18.07.2010 21:42, schrieb Stefan Weil:
>    
>> "No such file or directory" is a misleading error message
>> when a user tries to open a file with wrong permissions.
>>
>> Cc: Kevin Wolf<kwolf@redhat.com>
>> Signed-off-by: Stefan Weil<weil@mail.berlios.de>
>> ---
>>   block.c |   12 ++++++++----
>>   1 files changed, 8 insertions(+), 4 deletions(-)
>>
>> diff --git a/block.c b/block.c
>> index f837876..2f80540 100644
>> --- a/block.c
>> +++ b/block.c
>> @@ -330,16 +330,20 @@ BlockDriver *bdrv_find_protocol(const char *filename)
>>       return NULL;
>>   }
>>
>> -static BlockDriver *find_image_format(const char *filename)
>> +static BlockDriver *find_image_format(const char *filename, int *error)
>>      
> Wouldn't it be a more natural interface to return an 0/-errno int and
> pass the BlockDriver* by reference? I think we already have some
> function that work this way in the block code, but I can't remember any
> that get an int *error.
>    

... nor did I find a function which takes a BlockDriver**.
But if you prefer it like that, I can send a new version of the patch.

>    
>>   {
>>       int ret, score, score_max;
>>       BlockDriver *drv1, *drv;
>>       uint8_t buf[2048];
>>       BlockDriverState *bs;
>>
>> +    *error = -ENOENT;
>>      
> Why -ENOENT is the default would be clearer if you moved it down next to
> the drv = NULL before the loop that searches for the driver.
>
>    

What about the "return bdrv_find_format" lines?
They need a default value, too.

And I did not want to change too much because I cannot
run a complete test for all cases.

So setting *error at the beginning should be the safest
modification.

> Apart from these minor nitpicks it looks good.
>
> Kevin
>
>    
Thanks.

Stefan
Kevin Wolf - July 20, 2010, 7:44 a.m.
Am 19.07.2010 22:55, schrieb Stefan Weil:
> Am 19.07.2010 14:26, schrieb Kevin Wolf:
>> Am 18.07.2010 21:42, schrieb Stefan Weil:
>>    
>>> "No such file or directory" is a misleading error message
>>> when a user tries to open a file with wrong permissions.
>>>
>>> Cc: Kevin Wolf<kwolf@redhat.com>
>>> Signed-off-by: Stefan Weil<weil@mail.berlios.de>
>>> ---
>>>   block.c |   12 ++++++++----
>>>   1 files changed, 8 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/block.c b/block.c
>>> index f837876..2f80540 100644
>>> --- a/block.c
>>> +++ b/block.c
>>> @@ -330,16 +330,20 @@ BlockDriver *bdrv_find_protocol(const char *filename)
>>>       return NULL;
>>>   }
>>>
>>> -static BlockDriver *find_image_format(const char *filename)
>>> +static BlockDriver *find_image_format(const char *filename, int *error)
>>>      
>> Wouldn't it be a more natural interface to return an 0/-errno int and
>> pass the BlockDriver* by reference? I think we already have some
>> function that work this way in the block code, but I can't remember any
>> that get an int *error.
>>    
> 
> ... nor did I find a function which takes a BlockDriver**.
> But if you prefer it like that, I can send a new version of the patch.

Yes, I would prefer it like that. If you don't mind, please send a new
version.

>>    
>>>   {
>>>       int ret, score, score_max;
>>>       BlockDriver *drv1, *drv;
>>>       uint8_t buf[2048];
>>>       BlockDriverState *bs;
>>>
>>> +    *error = -ENOENT;
>>>      
>> Why -ENOENT is the default would be clearer if you moved it down next to
>> the drv = NULL before the loop that searches for the driver.
>>
>>    
> 
> What about the "return bdrv_find_format" lines?
> They need a default value, too.
> 
> And I did not want to change too much because I cannot
> run a complete test for all cases.
> 
> So setting *error at the beginning should be the safest
> modification.

You mean the return bdrv_find_format("raw")? Shouldn't ever fail unless
someone was crazy enough to compile raw out, but you're right. Better
leave it as it is.

Kevin

Patch

diff --git a/block.c b/block.c
index f837876..2f80540 100644
--- a/block.c
+++ b/block.c
@@ -330,16 +330,20 @@  BlockDriver *bdrv_find_protocol(const char *filename)
     return NULL;
 }
 
-static BlockDriver *find_image_format(const char *filename)
+static BlockDriver *find_image_format(const char *filename, int *error)
 {
     int ret, score, score_max;
     BlockDriver *drv1, *drv;
     uint8_t buf[2048];
     BlockDriverState *bs;
 
+    *error = -ENOENT;
+
     ret = bdrv_file_open(&bs, filename, 0);
-    if (ret < 0)
+    if (ret < 0) {
+        *error = ret;
         return NULL;
+    }
 
     /* Return the raw BlockDriver * to scsi-generic devices or empty drives */
     if (bs->sg || !bdrv_is_inserted(bs)) {
@@ -350,6 +354,7 @@  static BlockDriver *find_image_format(const char *filename)
     ret = bdrv_pread(bs, 0, buf, sizeof(buf));
     bdrv_delete(bs);
     if (ret < 0) {
+        *error = ret;
         return NULL;
     }
 
@@ -571,12 +576,11 @@  int bdrv_open(BlockDriverState *bs, const char *filename, int flags,
 
     /* Find the right image format driver */
     if (!drv) {
-        drv = find_image_format(filename);
+        drv = find_image_format(filename, &ret);
         probed = 1;
     }
 
     if (!drv) {
-        ret = -ENOENT;
         goto unlink_and_fail;
     }