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 <p...@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 >