On 09/22/2016 05:25 AM, Kevin Wolf wrote:

>>>  
>>> +static bool get_aio_option(QemuOpts *opts, int flags, Error **errp)
>>> +{
>>> +    const char *aio = qemu_opt_get(opts, "aio");
>>> +    if (!aio) {
>>> +        return !!(flags & BDRV_O_NATIVE_AIO);
>>> +    } else if (!strcmp(aio, "native")) {
>>> +        return true;
>>> +    } else if (!strcmp(aio, "threads")) {
>>> +        return false;
>>> +    }
>>> +
>>> +    error_setg(errp, "invalid aio option");
>>> +    return false;
>>> +}
>>
>> Is there somewhere common to share this, to avoid duplication?
> 
> I don't know where I would put it. This is a driver-specific option, so
> it doesn't belong in the generic block layer. It's just that two drivers
> happen to provide the same option currently. If we add another backend
> to raw-posix, raw-win32 wouldn't get the new option, so maybe leaving
> them separate is the best anyway.
> 

Fair enough...

> I guess I could do something like this to make the "duplicated" code
> look somewhat smaller, or at least condensed into a single statement:
> 
>     BlockdevAioOptions aio =
>         qapi_enum_parse(BlockdevAioOptions_lookup,
>                         qemu_opt_get(opts, "aio"),
>                         BLOCKDEV_AIO_OPTIONS__MAX,
>                         (flags & BDRV_O_NATIVE_AIO) ?
>                             BLOCKDEV_AIO_OPTIONS_NATIVE :
>                             BLOCKDEV_AIO_OPTIONS_THREADS);
>     s->use_linux_aio = (aio == BLOCKDEV_AIO_OPTIONS_NATIVE);
> 
> Would you consider this an improvement?

Yes, that looks nicer, because it's not hand-rolling the parse. If, in
the future, we do diverge and add a mode in posix that is not available
in win32, that just means we would have two separate QAPI enums, but
keep the qapi_enum_parse() in place for no additional if/else branches.

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