qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/2] qcow2_create() error handling fixes
@ 2010-10-07 20:25 Eduardo Habkost
  2010-10-07 20:25 ` [Qemu-devel] [PATCH 1/2] fix fd leak on one qcow2_create2() error path Eduardo Habkost
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Eduardo Habkost @ 2010-10-07 20:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: Kevin Wolf

From: Eduardo Habkost <ehabkost@raisama.net>

Hi,

Here are two small fixes on qcow2_create() error handling.

Eduardo Habkost (2):
  fix fd leak on a qcow2_create2() error path
  check for close() errors on qcow2_create()

 block/qcow2.c |   11 ++++++++---
 1 files changed, 8 insertions(+), 3 deletions(-)

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PATCH 1/2] fix fd leak on one qcow2_create2() error path
  2010-10-07 20:25 [Qemu-devel] [PATCH 0/2] qcow2_create() error handling fixes Eduardo Habkost
@ 2010-10-07 20:25 ` Eduardo Habkost
  2010-10-08  9:36   ` Stefan Hajnoczi
  2010-10-07 20:25 ` [Qemu-devel] [PATCH 2/2] check for close() errors on qcow2_create() Eduardo Habkost
  2010-10-08 10:11 ` [Qemu-devel] Re: [PATCH 0/2] qcow2_create() error handling fixes Kevin Wolf
  2 siblings, 1 reply; 9+ messages in thread
From: Eduardo Habkost @ 2010-10-07 20:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: Kevin Wolf

When getting an invalid cluster size, the open fd must be closed before
qcow2_create() returns an error.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 block/qcow2.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/block/qcow2.c b/block/qcow2.c
index ee3481b..c5fb28e 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -918,7 +918,8 @@ static int qcow_create2(const char *filename, int64_t total_size,
             "%d and %dk\n",
             1 << MIN_CLUSTER_BITS,
             1 << (MAX_CLUSTER_BITS - 10));
-        return -EINVAL;
+        ret = -EINVAL;
+        goto exit_close;
     }
     s->cluster_size = 1 << s->cluster_bits;
 
@@ -1052,6 +1053,8 @@ static int qcow_create2(const char *filename, int64_t total_size,
 exit:
     qemu_free(s->refcount_table);
     qemu_free(s->refcount_block);
+
+exit_close:
     close(fd);
 
     /* Preallocate metadata */
-- 
1.6.5.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PATCH 2/2] check for close() errors on qcow2_create()
  2010-10-07 20:25 [Qemu-devel] [PATCH 0/2] qcow2_create() error handling fixes Eduardo Habkost
  2010-10-07 20:25 ` [Qemu-devel] [PATCH 1/2] fix fd leak on one qcow2_create2() error path Eduardo Habkost
@ 2010-10-07 20:25 ` Eduardo Habkost
  2010-10-08  9:28   ` Stefan Hajnoczi
  2010-10-08 10:14   ` [Qemu-devel] " Kevin Wolf
  2010-10-08 10:11 ` [Qemu-devel] Re: [PATCH 0/2] qcow2_create() error handling fixes Kevin Wolf
  2 siblings, 2 replies; 9+ messages in thread
From: Eduardo Habkost @ 2010-10-07 20:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: Kevin Wolf

Errors when closing the file we just created should not be ignored. I/O errors
may happen and "qemu-img create" should fail in those cases.

If we are already exiting due to an error, we will still return the original
error number, though.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 block/qcow2.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/block/qcow2.c b/block/qcow2.c
index c5fb28e..d3a056b 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -882,7 +882,7 @@ static int qcow_create2(const char *filename, int64_t total_size,
     uint64_t old_ref_clusters;
     QCowCreateState s1, *s = &s1;
     QCowExtension ext_bf = {0, 0};
-    int ret;
+    int ret, cret;
 
     memset(s, 0, sizeof(*s));
 
@@ -1055,7 +1055,9 @@ exit:
     qemu_free(s->refcount_block);
 
 exit_close:
-    close(fd);
+    cret = close(fd);
+    if (ret == 0 && cret < 0)
+        ret = -errno;
 
     /* Preallocate metadata */
     if (ret == 0 && prealloc) {
-- 
1.6.5.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] check for close() errors on qcow2_create()
  2010-10-07 20:25 ` [Qemu-devel] [PATCH 2/2] check for close() errors on qcow2_create() Eduardo Habkost
@ 2010-10-08  9:28   ` Stefan Hajnoczi
  2010-10-08 15:29     ` Eduardo Habkost
  2010-10-08 10:14   ` [Qemu-devel] " Kevin Wolf
  1 sibling, 1 reply; 9+ messages in thread
From: Stefan Hajnoczi @ 2010-10-08  9:28 UTC (permalink / raw)
  To: Eduardo Habkost; +Cc: Kevin Wolf, qemu-devel

On Thu, Oct 7, 2010 at 9:25 PM, Eduardo Habkost <ehabkost@redhat.com> wrote:
> Errors when closing the file we just created should not be ignored. I/O errors
> may happen and "qemu-img create" should fail in those cases.
>
> If we are already exiting due to an error, we will still return the original
> error number, though.
>
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> ---
>  block/qcow2.c |    6 ++++--
>  1 files changed, 4 insertions(+), 2 deletions(-)

Sounds good.

> diff --git a/block/qcow2.c b/block/qcow2.c
> index c5fb28e..d3a056b 100644
> --- a/block/qcow2.c
> +++ b/block/qcow2.c
> @@ -882,7 +882,7 @@ static int qcow_create2(const char *filename, int64_t total_size,
>     uint64_t old_ref_clusters;
>     QCowCreateState s1, *s = &s1;
>     QCowExtension ext_bf = {0, 0};
> -    int ret;
> +    int ret, cret;
>
>     memset(s, 0, sizeof(*s));
>
> @@ -1055,7 +1055,9 @@ exit:
>     qemu_free(s->refcount_block);
>
>  exit_close:
> -    close(fd);
> +    cret = close(fd);
> +    if (ret == 0 && cret < 0)

if (close(fd) < 0 && ret == 0) {

Does the same without variable cret.

> +        ret = -errno;
>
>     /* Preallocate metadata */
>     if (ret == 0 && prealloc) {
> --
> 1.6.5.5
>
>
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] fix fd leak on one qcow2_create2() error path
  2010-10-07 20:25 ` [Qemu-devel] [PATCH 1/2] fix fd leak on one qcow2_create2() error path Eduardo Habkost
@ 2010-10-08  9:36   ` Stefan Hajnoczi
  0 siblings, 0 replies; 9+ messages in thread
From: Stefan Hajnoczi @ 2010-10-08  9:36 UTC (permalink / raw)
  To: Eduardo Habkost; +Cc: Kevin Wolf, qemu-devel

On Thu, Oct 7, 2010 at 9:25 PM, Eduardo Habkost <ehabkost@redhat.com> wrote:
> When getting an invalid cluster size, the open fd must be closed before
> qcow2_create() returns an error.
>
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> ---
>  block/qcow2.c |    5 ++++-
>  1 files changed, 4 insertions(+), 1 deletions(-)

Looks good.

Stefan

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Qemu-devel] Re: [PATCH 0/2] qcow2_create() error handling fixes
  2010-10-07 20:25 [Qemu-devel] [PATCH 0/2] qcow2_create() error handling fixes Eduardo Habkost
  2010-10-07 20:25 ` [Qemu-devel] [PATCH 1/2] fix fd leak on one qcow2_create2() error path Eduardo Habkost
  2010-10-07 20:25 ` [Qemu-devel] [PATCH 2/2] check for close() errors on qcow2_create() Eduardo Habkost
@ 2010-10-08 10:11 ` Kevin Wolf
  2 siblings, 0 replies; 9+ messages in thread
From: Kevin Wolf @ 2010-10-08 10:11 UTC (permalink / raw)
  To: Eduardo Habkost; +Cc: qemu-devel

Am 07.10.2010 22:25, schrieb Eduardo Habkost:
> From: Eduardo Habkost <ehabkost@raisama.net>
> 
> Hi,
> 
> Here are two small fixes on qcow2_create() error handling.
> 
> Eduardo Habkost (2):
>   fix fd leak on a qcow2_create2() error path
>   check for close() errors on qcow2_create()

A while ago I sent a patch to completely rewrite qcow_create using qemu
block layer functions. I didn't submit it for inclusion yet because it
makes some assumptions in qemu-iotests invalid and the test cases need
to be fixed first.

In the new version, your first patch wouldn't be needed. However, for
the second one, I think we have a problem today:

    void bdrv_close(BlockDriverState *bs);

We need to convert bdrv_close to be able to return error values and to
pass them on up to the first caller (which is qemu-img in this case).

I'll have a look at fixing the test cases and bdrv_close. If I can't get
it fixed easily, I'll consider your patches.

Kevin

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Qemu-devel] Re: [PATCH 2/2] check for close() errors on qcow2_create()
  2010-10-07 20:25 ` [Qemu-devel] [PATCH 2/2] check for close() errors on qcow2_create() Eduardo Habkost
  2010-10-08  9:28   ` Stefan Hajnoczi
@ 2010-10-08 10:14   ` Kevin Wolf
  2010-10-08 17:39     ` Eduardo Habkost
  1 sibling, 1 reply; 9+ messages in thread
From: Kevin Wolf @ 2010-10-08 10:14 UTC (permalink / raw)
  To: Eduardo Habkost; +Cc: qemu-devel

Am 07.10.2010 22:25, schrieb Eduardo Habkost:
> Errors when closing the file we just created should not be ignored. I/O errors
> may happen and "qemu-img create" should fail in those cases.
> 
> If we are already exiting due to an error, we will still return the original
> error number, though.
> 
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> ---
>  block/qcow2.c |    6 ++++--
>  1 files changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/block/qcow2.c b/block/qcow2.c
> index c5fb28e..d3a056b 100644
> --- a/block/qcow2.c
> +++ b/block/qcow2.c
> @@ -882,7 +882,7 @@ static int qcow_create2(const char *filename, int64_t total_size,
>      uint64_t old_ref_clusters;
>      QCowCreateState s1, *s = &s1;
>      QCowExtension ext_bf = {0, 0};
> -    int ret;
> +    int ret, cret;
>  
>      memset(s, 0, sizeof(*s));
>  
> @@ -1055,7 +1055,9 @@ exit:
>      qemu_free(s->refcount_block);
>  
>  exit_close:
> -    close(fd);
> +    cret = close(fd);
> +    if (ret == 0 && cret < 0)
> +        ret = -errno;

Braces are missing here.

Kevin

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] check for close() errors on qcow2_create()
  2010-10-08  9:28   ` Stefan Hajnoczi
@ 2010-10-08 15:29     ` Eduardo Habkost
  0 siblings, 0 replies; 9+ messages in thread
From: Eduardo Habkost @ 2010-10-08 15:29 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: Kevin Wolf, qemu-devel

On Fri, Oct 08, 2010 at 10:28:37AM +0100, Stefan Hajnoczi wrote:
> >  exit_close:
> > -    close(fd);
> > +    cret = close(fd);
> > +    if (ret == 0 && cret < 0)
> 
> if (close(fd) < 0 && ret == 0) {
> 
> Does the same without variable cret.

Yes. I used the variable just for readability. I personally don't like
having side-effects inside a if condition.

-- 
Eduardo

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Qemu-devel] Re: [PATCH 2/2] check for close() errors on qcow2_create()
  2010-10-08 10:14   ` [Qemu-devel] " Kevin Wolf
@ 2010-10-08 17:39     ` Eduardo Habkost
  0 siblings, 0 replies; 9+ messages in thread
From: Eduardo Habkost @ 2010-10-08 17:39 UTC (permalink / raw)
  To: Kevin Wolf; +Cc: qemu-devel

On Fri, Oct 08, 2010 at 12:14:07PM +0200, Kevin Wolf wrote:
> Am 07.10.2010 22:25, schrieb Eduardo Habkost:
> > Errors when closing the file we just created should not be ignored. I/O errors
> > may happen and "qemu-img create" should fail in those cases.
> > 
> > If we are already exiting due to an error, we will still return the original
> > error number, though.
[...]
> >  exit_close:
> > -    close(fd);
> > +    cret = close(fd);
> > +    if (ret == 0 && cret < 0)
> > +        ret = -errno;
> 
> Braces are missing here.

Updated patch below.

I won't resubmit the series as a new thread, as it depends on deciding
what to do about the qcow2_create() rewrite.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 block/qcow2.c |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/block/qcow2.c b/block/qcow2.c
index c5fb28e..e2e9a95 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -882,7 +882,7 @@ static int qcow_create2(const char *filename, int64_t total_size,
     uint64_t old_ref_clusters;
     QCowCreateState s1, *s = &s1;
     QCowExtension ext_bf = {0, 0};
-    int ret;
+    int ret, cret;
 
     memset(s, 0, sizeof(*s));
 
@@ -1055,7 +1055,10 @@ exit:
     qemu_free(s->refcount_block);
 
 exit_close:
-    close(fd);
+    cret = close(fd);
+    if (ret == 0 && cret < 0) {
+        ret = -errno;
+    }
 
     /* Preallocate metadata */
     if (ret == 0 && prealloc) {
-- 
1.6.5.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2010-10-08 17:40 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-10-07 20:25 [Qemu-devel] [PATCH 0/2] qcow2_create() error handling fixes Eduardo Habkost
2010-10-07 20:25 ` [Qemu-devel] [PATCH 1/2] fix fd leak on one qcow2_create2() error path Eduardo Habkost
2010-10-08  9:36   ` Stefan Hajnoczi
2010-10-07 20:25 ` [Qemu-devel] [PATCH 2/2] check for close() errors on qcow2_create() Eduardo Habkost
2010-10-08  9:28   ` Stefan Hajnoczi
2010-10-08 15:29     ` Eduardo Habkost
2010-10-08 10:14   ` [Qemu-devel] " Kevin Wolf
2010-10-08 17:39     ` Eduardo Habkost
2010-10-08 10:11 ` [Qemu-devel] Re: [PATCH 0/2] qcow2_create() error handling fixes Kevin Wolf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).