Skip to content
  • Nishanth Aravamudan's avatar
    linux-aio: properly bubble up errors from initialization · ed6e2161
    Nishanth Aravamudan authored
    
    
    laio_init() can fail for a couple of reasons, which will lead to a NULL
    pointer dereference in laio_attach_aio_context().
    
    To solve this, add a aio_setup_linux_aio() function which is called
    early in raw_open_common. If this fails, propagate the error up. The
    signature of aio_get_linux_aio() was not modified, because it seems
    preferable to return the actual errno from the possible failing
    initialization calls.
    
    Additionally, when the AioContext changes, we need to associate a
    LinuxAioState with the new AioContext. Use the bdrv_attach_aio_context
    callback and call the new aio_setup_linux_aio(), which will allocate a
    new AioContext if needed, and return errors on failures. If it fails for
    any reason, fallback to threaded AIO with an error message, as the
    device is already in-use by the guest.
    
    Add an assert that aio_get_linux_aio() cannot return NULL.
    
    Signed-off-by: default avatarNishanth Aravamudan <naravamudan@digitalocean.com>
    Message-id: 20180622193700.6523-1-naravamudan@digitalocean.com
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    ed6e2161