• Maxim Patlasov's avatar
    fuse: add support of async IO · 01e9d11a
    Maxim Patlasov authored
    The patch implements a framework to process an IO request asynchronously. The
    idea is to associate several fuse requests with a single kiocb by means of
    fuse_io_priv structure. The structure plays the same role for FUSE as 'struct
    dio' for direct-io.c.
    The framework is supposed to be used like this:
     - someone (who wants to process an IO asynchronously) allocates fuse_io_priv
       and initializes it setting 'async' field to non-zero value.
     - as soon as fuse request is filled, it can be submitted (in non-blocking way)
       by fuse_async_req_send()
     - when all submitted requests are ACKed by userspace, io->reqs drops to zero
       triggering aio_complete()
    In case of IO initiated by libaio, aio_complete() will finish processing the
    same way as in case of dio_complete() calling aio_complete(). But the
    framework may be also used for internal FUSE use when initial IO request
    was synchronous (from user perspective), but it's beneficial to process it
    asynchronously. Then the caller should wait on kiocb explicitly and
    aio_complete() will wake the caller up.
    Signed-off-by: default avatarMaxim Patlasov <mpatlasov@parallels.com>
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>