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

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

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to