* [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).