Re: [Qemu-devel] [PATCH 3/9] block: bdrv_reopen_prepare(): use error_setg_file_open()

2013-06-10 Thread Stefan Hajnoczi
On Fri, Jun 07, 2013 at 03:52:29PM -0400, Luiz Capitulino wrote:
 Signed-off-by: Luiz Capitulino lcapitul...@redhat.com
 ---
  block.c | 3 +--
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 diff --git a/block.c b/block.c
 index 79ad33d..c78f152 100644
 --- a/block.c
 +++ b/block.c
 @@ -1291,8 +1291,7 @@ int bdrv_reopen_prepare(BDRVReopenState *reopen_state, 
 BlockReopenQueue *queue,
  if (local_err != NULL) {
  error_propagate(errp, local_err);
  } else {
 -error_set(errp, QERR_OPEN_FILE_FAILED,
 -  reopen_state-bs-filename);
 +error_setg_file_open(errp, errno, 
 reopen_state-bs-filename);

s/errno/-ret/



Re: [Qemu-devel] [PATCH 3/9] block: bdrv_reopen_prepare(): use error_setg_file_open()

2013-06-10 Thread Stefan Hajnoczi
On Fri, Jun 07, 2013 at 03:52:29PM -0400, Luiz Capitulino wrote:
 Signed-off-by: Luiz Capitulino lcapitul...@redhat.com
 ---
  block.c | 3 +--
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 diff --git a/block.c b/block.c
 index 79ad33d..c78f152 100644
 --- a/block.c
 +++ b/block.c
 @@ -1291,8 +1291,7 @@ int bdrv_reopen_prepare(BDRVReopenState *reopen_state, 
 BlockReopenQueue *queue,
  if (local_err != NULL) {
  error_propagate(errp, local_err);
  } else {
 -error_set(errp, QERR_OPEN_FILE_FAILED,
 -  reopen_state-bs-filename);
 +error_setg_file_open(errp, errno, 
 reopen_state-bs-filename);

Looking closer, my suggestion was wrong too.

I think QERR_OPEN_FILE_FAILED is simply the wrong error here.  We don't
know that the error occurred when trying to open a file.

errno does not necessarily contain the error value!

Stefan



Re: [Qemu-devel] [PATCH 3/9] block: bdrv_reopen_prepare(): use error_setg_file_open()

2013-06-10 Thread Luiz Capitulino
On Mon, 10 Jun 2013 10:43:47 +0200
Stefan Hajnoczi stefa...@gmail.com wrote:

 On Fri, Jun 07, 2013 at 03:52:29PM -0400, Luiz Capitulino wrote:
  Signed-off-by: Luiz Capitulino lcapitul...@redhat.com
  ---
   block.c | 3 +--
   1 file changed, 1 insertion(+), 2 deletions(-)
  
  diff --git a/block.c b/block.c
  index 79ad33d..c78f152 100644
  --- a/block.c
  +++ b/block.c
  @@ -1291,8 +1291,7 @@ int bdrv_reopen_prepare(BDRVReopenState 
  *reopen_state, BlockReopenQueue *queue,
   if (local_err != NULL) {
   error_propagate(errp, local_err);
   } else {
  -error_set(errp, QERR_OPEN_FILE_FAILED,
  -  reopen_state-bs-filename);
  +error_setg_file_open(errp, errno, 
  reopen_state-bs-filename);
 
 Looking closer, my suggestion was wrong too.
 
 I think QERR_OPEN_FILE_FAILED is simply the wrong error here.  We don't
 know that the error occurred when trying to open a file.

Right.

 errno does not necessarily contain the error value!

There are two ways to fix it (and they're not mutually exclusive):

 1. We could review all bdrv_reopen_prepare() methods and make sure they
set errno on failure

 2. We set errno=0 before calling the bdrv_reopen_prepare() method and if
there's an error and if errno != 0 we use it, otherwise we set a generic
failed to prepare to reopen image error

Option 1 goes a bit beyond the time I'd like to spent on this series.
Option 2 is quite reasonable.

What do you think?



Re: [Qemu-devel] [PATCH 3/9] block: bdrv_reopen_prepare(): use error_setg_file_open()

2013-06-10 Thread Kevin Wolf
Am 10.06.2013 um 15:21 hat Luiz Capitulino geschrieben:
 On Mon, 10 Jun 2013 10:43:47 +0200
 Stefan Hajnoczi stefa...@gmail.com wrote:
 
  On Fri, Jun 07, 2013 at 03:52:29PM -0400, Luiz Capitulino wrote:
   Signed-off-by: Luiz Capitulino lcapitul...@redhat.com
   ---
block.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
   
   diff --git a/block.c b/block.c
   index 79ad33d..c78f152 100644
   --- a/block.c
   +++ b/block.c
   @@ -1291,8 +1291,7 @@ int bdrv_reopen_prepare(BDRVReopenState 
   *reopen_state, BlockReopenQueue *queue,
if (local_err != NULL) {
error_propagate(errp, local_err);
} else {
   -error_set(errp, QERR_OPEN_FILE_FAILED,
   -  reopen_state-bs-filename);
   +error_setg_file_open(errp, errno, 
   reopen_state-bs-filename);
  
  Looking closer, my suggestion was wrong too.
  
  I think QERR_OPEN_FILE_FAILED is simply the wrong error here.  We don't
  know that the error occurred when trying to open a file.
 
 Right.
 
  errno does not necessarily contain the error value!
 
 There are two ways to fix it (and they're not mutually exclusive):
 
  1. We could review all bdrv_reopen_prepare() methods and make sure they
 set errno on failure
 
  2. We set errno=0 before calling the bdrv_reopen_prepare() method and if
 there's an error and if errno != 0 we use it, otherwise we set a generic
 failed to prepare to reopen image error
 
 Option 1 goes a bit beyond the time I'd like to spent on this series.
 Option 2 is quite reasonable.
 
 What do you think?

errno is definitely not reliable here and won't be. You must use -ret if
you want a meaningful error message.

I think Stefan's point was more that Could not open might not be the
right message for a reopen, so we'd have to use error_setg_errno()
directly with a different message here, like Could not prepare reopen
for '%s'.

The _real_ solution, of course, is to make bdrv_prepare_reopen() a void
function and always set errp when something goes wrong.

Kevin



Re: [Qemu-devel] [PATCH 3/9] block: bdrv_reopen_prepare(): use error_setg_file_open()

2013-06-10 Thread Luiz Capitulino
On Mon, 10 Jun 2013 15:54:10 +0200
Kevin Wolf kw...@redhat.com wrote:

 Am 10.06.2013 um 15:21 hat Luiz Capitulino geschrieben:
  On Mon, 10 Jun 2013 10:43:47 +0200
  Stefan Hajnoczi stefa...@gmail.com wrote:
  
   On Fri, Jun 07, 2013 at 03:52:29PM -0400, Luiz Capitulino wrote:
Signed-off-by: Luiz Capitulino lcapitul...@redhat.com
---
 block.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/block.c b/block.c
index 79ad33d..c78f152 100644
--- a/block.c
+++ b/block.c
@@ -1291,8 +1291,7 @@ int bdrv_reopen_prepare(BDRVReopenState 
*reopen_state, BlockReopenQueue *queue,
 if (local_err != NULL) {
 error_propagate(errp, local_err);
 } else {
-error_set(errp, QERR_OPEN_FILE_FAILED,
-  reopen_state-bs-filename);
+error_setg_file_open(errp, errno, 
reopen_state-bs-filename);
   
   Looking closer, my suggestion was wrong too.
   
   I think QERR_OPEN_FILE_FAILED is simply the wrong error here.  We don't
   know that the error occurred when trying to open a file.
  
  Right.
  
   errno does not necessarily contain the error value!
  
  There are two ways to fix it (and they're not mutually exclusive):
  
   1. We could review all bdrv_reopen_prepare() methods and make sure they
  set errno on failure
  
   2. We set errno=0 before calling the bdrv_reopen_prepare() method and if
  there's an error and if errno != 0 we use it, otherwise we set a generic
  failed to prepare to reopen image error
  
  Option 1 goes a bit beyond the time I'd like to spent on this series.
  Option 2 is quite reasonable.
  
  What do you think?
 
 errno is definitely not reliable here and won't be. You must use -ret if
 you want a meaningful error message.
 
 I think Stefan's point was more that Could not open might not be the
 right message for a reopen, so we'd have to use error_setg_errno()
 directly with a different message here, like Could not prepare reopen
 for '%s'.

Ok, but Stefan also said that -ret is not reliable. And after quickly
checking the code I see he's right, as there are methods that return -1.

I think the safest thing to do is to have a generic error message for
for this now and in the future we should propagate errp or return -errno.



Re: [Qemu-devel] [PATCH 3/9] block: bdrv_reopen_prepare(): use error_setg_file_open()

2013-06-10 Thread Kevin Wolf
Am 10.06.2013 um 16:02 hat Luiz Capitulino geschrieben:
 On Mon, 10 Jun 2013 15:54:10 +0200
 Kevin Wolf kw...@redhat.com wrote:
 
  Am 10.06.2013 um 15:21 hat Luiz Capitulino geschrieben:
   On Mon, 10 Jun 2013 10:43:47 +0200
   Stefan Hajnoczi stefa...@gmail.com wrote:
   
On Fri, Jun 07, 2013 at 03:52:29PM -0400, Luiz Capitulino wrote:
 Signed-off-by: Luiz Capitulino lcapitul...@redhat.com
 ---
  block.c | 3 +--
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 diff --git a/block.c b/block.c
 index 79ad33d..c78f152 100644
 --- a/block.c
 +++ b/block.c
 @@ -1291,8 +1291,7 @@ int bdrv_reopen_prepare(BDRVReopenState 
 *reopen_state, BlockReopenQueue *queue,
  if (local_err != NULL) {
  error_propagate(errp, local_err);
  } else {
 -error_set(errp, QERR_OPEN_FILE_FAILED,
 -  reopen_state-bs-filename);
 +error_setg_file_open(errp, errno, 
 reopen_state-bs-filename);

Looking closer, my suggestion was wrong too.

I think QERR_OPEN_FILE_FAILED is simply the wrong error here.  We don't
know that the error occurred when trying to open a file.
   
   Right.
   
errno does not necessarily contain the error value!
   
   There are two ways to fix it (and they're not mutually exclusive):
   
1. We could review all bdrv_reopen_prepare() methods and make sure they
   set errno on failure
   
2. We set errno=0 before calling the bdrv_reopen_prepare() method and if
   there's an error and if errno != 0 we use it, otherwise we set a 
   generic
   failed to prepare to reopen image error
   
   Option 1 goes a bit beyond the time I'd like to spent on this series.
   Option 2 is quite reasonable.
   
   What do you think?
  
  errno is definitely not reliable here and won't be. You must use -ret if
  you want a meaningful error message.
  
  I think Stefan's point was more that Could not open might not be the
  right message for a reopen, so we'd have to use error_setg_errno()
  directly with a different message here, like Could not prepare reopen
  for '%s'.
 
 Ok, but Stefan also said that -ret is not reliable. And after quickly
 checking the code I see he's right, as there are methods that return -1.
 
 I think the safest thing to do is to have a generic error message for
 for this now and in the future we should propagate errp or return -errno.

Ah, yes. I agree, let's make it error_setg() without errno for now.

Kevin



[Qemu-devel] [PATCH 3/9] block: bdrv_reopen_prepare(): use error_setg_file_open()

2013-06-07 Thread Luiz Capitulino
Signed-off-by: Luiz Capitulino lcapitul...@redhat.com
---
 block.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/block.c b/block.c
index 79ad33d..c78f152 100644
--- a/block.c
+++ b/block.c
@@ -1291,8 +1291,7 @@ int bdrv_reopen_prepare(BDRVReopenState *reopen_state, 
BlockReopenQueue *queue,
 if (local_err != NULL) {
 error_propagate(errp, local_err);
 } else {
-error_set(errp, QERR_OPEN_FILE_FAILED,
-  reopen_state-bs-filename);
+error_setg_file_open(errp, errno, reopen_state-bs-filename);
 }
 goto error;
 }
-- 
1.8.1.4