if the passed qiov contains exactly one iov we can
pass the buffer directly.
Signed-off-by: Peter Lieven <pl@kamp.de>
---
block/nfs.c | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/block/nfs.c b/block/nfs.c
index ab5dcc2..bb4b75f 100644
--- a/block/nfs.c
+++ b/block/nfs.c
@@ -295,20 +295,27 @@ static int coroutine_fn nfs_co_pwritev(BlockDriverState *bs, uint64_t offset,
NFSClient *client = bs->opaque;
NFSRPC task;
char *buf = NULL;
+ bool my_buffer = false;
nfs_co_init_task(bs, &task);
- buf = g_try_malloc(bytes);
- if (bytes && buf == NULL) {
- return -ENOMEM;
+ if (iov->niov != 1) {
+ buf = g_try_malloc(bytes);
+ if (bytes && buf == NULL) {
+ return -ENOMEM;
+ }
+ qemu_iovec_to_buf(iov, 0, buf, bytes);
+ my_buffer = true;
+ } else {
+ buf = iov->iov[0].iov_base;
}
- qemu_iovec_to_buf(iov, 0, buf, bytes);
-
if (nfs_pwrite_async(client->context, client->fh,
offset, bytes, buf,
nfs_co_generic_cb, &task) != 0) {
- g_free(buf);
+ if (my_buffer) {
+ g_free(buf);
+ }
return -ENOMEM;
}
@@ -317,7 +324,9 @@ static int coroutine_fn nfs_co_pwritev(BlockDriverState *bs, uint64_t offset,
qemu_coroutine_yield();
}
- g_free(buf);
+ if (my_buffer) {
+ g_free(buf);
+ }
if (task.ret != bytes) {
return task.ret < 0 ? task.ret : -EIO;
--
1.9.1
On Fri, Feb 17, 2017 at 05:39:01PM +0100, Peter Lieven wrote:
> if the passed qiov contains exactly one iov we can
> pass the buffer directly.
>
> Signed-off-by: Peter Lieven <pl@kamp.de>
> ---
> block/nfs.c | 23 ++++++++++++++++-------
> 1 file changed, 16 insertions(+), 7 deletions(-)
>
> diff --git a/block/nfs.c b/block/nfs.c
> index ab5dcc2..bb4b75f 100644
> --- a/block/nfs.c
> +++ b/block/nfs.c
> @@ -295,20 +295,27 @@ static int coroutine_fn nfs_co_pwritev(BlockDriverState *bs, uint64_t offset,
> NFSClient *client = bs->opaque;
> NFSRPC task;
> char *buf = NULL;
> + bool my_buffer = false;
g_free() is a nop if buf is NULL, so there is no need for the my_buffer
variable & check.
>
> nfs_co_init_task(bs, &task);
>
> - buf = g_try_malloc(bytes);
> - if (bytes && buf == NULL) {
> - return -ENOMEM;
> + if (iov->niov != 1) {
> + buf = g_try_malloc(bytes);
> + if (bytes && buf == NULL) {
> + return -ENOMEM;
> + }
> + qemu_iovec_to_buf(iov, 0, buf, bytes);
> + my_buffer = true;
> + } else {
> + buf = iov->iov[0].iov_base;
> }
>
> - qemu_iovec_to_buf(iov, 0, buf, bytes);
> -
> if (nfs_pwrite_async(client->context, client->fh,
> offset, bytes, buf,
> nfs_co_generic_cb, &task) != 0) {
> - g_free(buf);
> + if (my_buffer) {
> + g_free(buf);
> + }
> return -ENOMEM;
> }
>
> @@ -317,7 +324,9 @@ static int coroutine_fn nfs_co_pwritev(BlockDriverState *bs, uint64_t offset,
> qemu_coroutine_yield();
> }
>
> - g_free(buf);
> + if (my_buffer) {
> + g_free(buf);
> + }
>
> if (task.ret != bytes) {
> return task.ret < 0 ? task.ret : -EIO;
> --
> 1.9.1
>
On 02/17/2017 03:37 PM, Jeff Cody wrote:
> On Fri, Feb 17, 2017 at 05:39:01PM +0100, Peter Lieven wrote:
>> if the passed qiov contains exactly one iov we can
>> pass the buffer directly.
>>
>> Signed-off-by: Peter Lieven <pl@kamp.de>
>> ---
>> block/nfs.c | 23 ++++++++++++++++-------
>> 1 file changed, 16 insertions(+), 7 deletions(-)
>>
>> diff --git a/block/nfs.c b/block/nfs.c
>> index ab5dcc2..bb4b75f 100644
>> --- a/block/nfs.c
>> +++ b/block/nfs.c
>> @@ -295,20 +295,27 @@ static int coroutine_fn nfs_co_pwritev(BlockDriverState *bs, uint64_t offset,
>> NFSClient *client = bs->opaque;
>> NFSRPC task;
>> char *buf = NULL;
>> + bool my_buffer = false;
>
> g_free() is a nop if buf is NULL, so there is no need for the my_buffer
> variable & check.
Umm, yes there is:
>> + if (iov->niov != 1) {
>> + buf = g_try_malloc(bytes);
>> + if (bytes && buf == NULL) {
>> + return -ENOMEM;
>> + }
>> + qemu_iovec_to_buf(iov, 0, buf, bytes);
>> + my_buffer = true;
>> + } else {
>> + buf = iov->iov[0].iov_base;
If we took the else branch, then we definitely do not want to be calling
g_free(buf).
>> }
>>
>> - qemu_iovec_to_buf(iov, 0, buf, bytes);
>> -
>> if (nfs_pwrite_async(client->context, client->fh,
>> offset, bytes, buf,
>> nfs_co_generic_cb, &task) != 0) {
>> - g_free(buf);
>> + if (my_buffer) {
>> + g_free(buf);
>> + }
It looks correct as-is to me.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
On Fri, Feb 17, 2017 at 03:42:52PM -0600, Eric Blake wrote:
> On 02/17/2017 03:37 PM, Jeff Cody wrote:
> > On Fri, Feb 17, 2017 at 05:39:01PM +0100, Peter Lieven wrote:
> >> if the passed qiov contains exactly one iov we can
> >> pass the buffer directly.
> >>
> >> Signed-off-by: Peter Lieven <pl@kamp.de>
> >> ---
> >> block/nfs.c | 23 ++++++++++++++++-------
> >> 1 file changed, 16 insertions(+), 7 deletions(-)
> >>
> >> diff --git a/block/nfs.c b/block/nfs.c
> >> index ab5dcc2..bb4b75f 100644
> >> --- a/block/nfs.c
> >> +++ b/block/nfs.c
> >> @@ -295,20 +295,27 @@ static int coroutine_fn nfs_co_pwritev(BlockDriverState *bs, uint64_t offset,
> >> NFSClient *client = bs->opaque;
> >> NFSRPC task;
> >> char *buf = NULL;
> >> + bool my_buffer = false;
> >
> > g_free() is a nop if buf is NULL, so there is no need for the my_buffer
> > variable & check.
>
> Umm, yes there is:
>
> >> + if (iov->niov != 1) {
> >> + buf = g_try_malloc(bytes);
> >> + if (bytes && buf == NULL) {
> >> + return -ENOMEM;
> >> + }
> >> + qemu_iovec_to_buf(iov, 0, buf, bytes);
> >> + my_buffer = true;
> >> + } else {
> >> + buf = iov->iov[0].iov_base;
>
> If we took the else branch, then we definitely do not want to be calling
> g_free(buf).
Doh!
>
> >> }
> >>
> >> - qemu_iovec_to_buf(iov, 0, buf, bytes);
> >> -
> >> if (nfs_pwrite_async(client->context, client->fh,
> >> offset, bytes, buf,
> >> nfs_co_generic_cb, &task) != 0) {
> >> - g_free(buf);
> >> + if (my_buffer) {
> >> + g_free(buf);
> >> + }
>
> It looks correct as-is to me.
Indeed.
Reviewed-by: Jeff Cody <jcody@redhat.com>
Am 17.02.2017 um 22:51 hat Jeff Cody geschrieben:
> On Fri, Feb 17, 2017 at 03:42:52PM -0600, Eric Blake wrote:
> > On 02/17/2017 03:37 PM, Jeff Cody wrote:
> > > On Fri, Feb 17, 2017 at 05:39:01PM +0100, Peter Lieven wrote:
> > >> if the passed qiov contains exactly one iov we can
> > >> pass the buffer directly.
> > >>
> > >> Signed-off-by: Peter Lieven <pl@kamp.de>
> > >> ---
> > >> block/nfs.c | 23 ++++++++++++++++-------
> > >> 1 file changed, 16 insertions(+), 7 deletions(-)
> > >>
> > >> diff --git a/block/nfs.c b/block/nfs.c
> > >> index ab5dcc2..bb4b75f 100644
> > >> --- a/block/nfs.c
> > >> +++ b/block/nfs.c
> > >> @@ -295,20 +295,27 @@ static int coroutine_fn nfs_co_pwritev(BlockDriverState *bs, uint64_t offset,
> > >> NFSClient *client = bs->opaque;
> > >> NFSRPC task;
> > >> char *buf = NULL;
> > >> + bool my_buffer = false;
> > >
> > > g_free() is a nop if buf is NULL, so there is no need for the my_buffer
> > > variable & check.
> >
> > Umm, yes there is:
> >
> > >> + if (iov->niov != 1) {
> > >> + buf = g_try_malloc(bytes);
> > >> + if (bytes && buf == NULL) {
> > >> + return -ENOMEM;
> > >> + }
> > >> + qemu_iovec_to_buf(iov, 0, buf, bytes);
> > >> + my_buffer = true;
> > >> + } else {
> > >> + buf = iov->iov[0].iov_base;
> >
> > If we took the else branch, then we definitely do not want to be calling
> > g_free(buf).
>
> Doh!
>
> >
> > >> }
> > >>
> > >> - qemu_iovec_to_buf(iov, 0, buf, bytes);
> > >> -
> > >> if (nfs_pwrite_async(client->context, client->fh,
> > >> offset, bytes, buf,
> > >> nfs_co_generic_cb, &task) != 0) {
> > >> - g_free(buf);
> > >> + if (my_buffer) {
> > >> + g_free(buf);
> > >> + }
> >
> > It looks correct as-is to me.
>
> Indeed.
>
> Reviewed-by: Jeff Cody <jcody@redhat.com>
You gave R-b for both patches, but did not merge it - who is supposed to
do that?
Kevin
On Wed, Feb 22, 2017 at 01:47:10PM +0100, Kevin Wolf wrote:
> Am 17.02.2017 um 22:51 hat Jeff Cody geschrieben:
> > On Fri, Feb 17, 2017 at 03:42:52PM -0600, Eric Blake wrote:
> > > On 02/17/2017 03:37 PM, Jeff Cody wrote:
> > > > On Fri, Feb 17, 2017 at 05:39:01PM +0100, Peter Lieven wrote:
> > > >> if the passed qiov contains exactly one iov we can
> > > >> pass the buffer directly.
> > > >>
> > > >> Signed-off-by: Peter Lieven <pl@kamp.de>
> > > >> ---
> > > >> block/nfs.c | 23 ++++++++++++++++-------
> > > >> 1 file changed, 16 insertions(+), 7 deletions(-)
> > > >>
> > > >> diff --git a/block/nfs.c b/block/nfs.c
> > > >> index ab5dcc2..bb4b75f 100644
> > > >> --- a/block/nfs.c
> > > >> +++ b/block/nfs.c
> > > >> @@ -295,20 +295,27 @@ static int coroutine_fn nfs_co_pwritev(BlockDriverState *bs, uint64_t offset,
> > > >> NFSClient *client = bs->opaque;
> > > >> NFSRPC task;
> > > >> char *buf = NULL;
> > > >> + bool my_buffer = false;
> > > >
> > > > g_free() is a nop if buf is NULL, so there is no need for the my_buffer
> > > > variable & check.
> > >
> > > Umm, yes there is:
> > >
> > > >> + if (iov->niov != 1) {
> > > >> + buf = g_try_malloc(bytes);
> > > >> + if (bytes && buf == NULL) {
> > > >> + return -ENOMEM;
> > > >> + }
> > > >> + qemu_iovec_to_buf(iov, 0, buf, bytes);
> > > >> + my_buffer = true;
> > > >> + } else {
> > > >> + buf = iov->iov[0].iov_base;
> > >
> > > If we took the else branch, then we definitely do not want to be calling
> > > g_free(buf).
> >
> > Doh!
> >
> > >
> > > >> }
> > > >>
> > > >> - qemu_iovec_to_buf(iov, 0, buf, bytes);
> > > >> -
> > > >> if (nfs_pwrite_async(client->context, client->fh,
> > > >> offset, bytes, buf,
> > > >> nfs_co_generic_cb, &task) != 0) {
> > > >> - g_free(buf);
> > > >> + if (my_buffer) {
> > > >> + g_free(buf);
> > > >> + }
> > >
> > > It looks correct as-is to me.
> >
> > Indeed.
> >
> > Reviewed-by: Jeff Cody <jcody@redhat.com>
>
> You gave R-b for both patches, but did not merge it - who is supposed to
> do that?
>
I am going to do it in my next round, I was just waiting to see if there
were any other comments.
© 2016 - 2026 Red Hat, Inc.