--- a/src/server/daemon/vfs.c Wed Jan 10 17:25:55 2018 +0100 +++ b/src/server/daemon/vfs.c Wed Jan 10 18:47:37 2018 +0100 @@ -39,6 +39,7 @@ #include "../util/pool.h" #include "acl.h" #include "vfs.h" +#include "threadpools.h" #include "event.h" #define VFS_MALLOC(pool, size) pool ? pool_malloc(pool, size) : malloc(size) @@ -61,8 +62,10 @@ sys_file_write, sys_file_seek, sys_file_close, - sys_file_aioread, - sys_file_aiowrite + //sys_file_aioread, + //sys_file_aiowrite, + NULL, + NULL }; static VFS_DIRIO sys_dir_io = { @@ -602,8 +605,8 @@ if(file->io->opt_aioread) { return file->io->opt_aioread(aiocb); } else { - // TODO: implement - return -1; + vfs_queue_aio(aiocb, VFS_AIO_READ); + return 0; } } @@ -617,7 +620,38 @@ if(file->io->opt_aiowrite) { return file->io->opt_aiowrite(aiocb); } else { - // TODO: implement - return -1; + vfs_queue_aio(aiocb, VFS_AIO_WRITE); + return 0; } } + +static void* vfs_aio_read(aiocb_s *aiocb) { + system_lseek(aiocb->filedes, aiocb->offset, SEEK_SET); + int result = system_fread(aiocb->filedes, aiocb->buf, aiocb->nbytes); + aiocb->result = result; + if(result < 0) { + aiocb->result_errno = errno; + } + event_send(aiocb->evhandler, aiocb->event); + return NULL; +} + +static void* vfs_aio_write(aiocb_s *aiocb) { + system_lseek(aiocb->filedes, aiocb->offset, SEEK_SET); + int result = system_fwrite(aiocb->filedes, aiocb->buf, aiocb->nbytes); + aiocb->result = result; + if(result < 0) { + aiocb->result_errno = errno; + } + event_send(aiocb->evhandler, aiocb->event); + return NULL; +} + +void vfs_queue_aio(aiocb_s *aiocb, VFSAioOp op) { + threadpool_t *pool = get_default_threadpool(); // TODO: use IOPool + if(op == VFS_AIO_READ) { + threadpool_run(pool, (job_callback_f)vfs_aio_read, aiocb); + } else if(VFS_AIO_WRITE) { + threadpool_run(pool, (job_callback_f)vfs_aio_write, aiocb); + } +}