I find nbd quite useful to test migration, but it is limited: it can only do synchronous operation, it is not safe because it does not support flush, and it has no discard either. qemu-nbd is also limited to 1MB requests, and the nbd block driver does not take this into account.
Luckily, flush/FUA support is being worked out by upstream, and discard can also be added with the same framework (patches 1 to 6). Asynchronous support is also very similar to what sheepdog is already doing (patches 7 to 12). Paolo Bonzini (12): nbd: support feature negotiation nbd: sync API definitions with upstream nbd: support NBD_SET_FLAGS ioctl nbd: add support for NBD_CMD_FLUSH nbd: add support for NBD_CMD_FLAG_FUA nbd: support NBD_CMD_TRIM in the server sheepdog: add coroutine_fn markers add socket_set_block sheepdog: move coroutine send/recv function to generic code block: add bdrv_co_flush support nbd: switch to asynchronous operation nbd: split requests block.c | 53 ++++++++++--- block/nbd.c | 225 ++++++++++++++++++++++++++++++++++++++++++++-------- block/sheepdog.c | 235 +++++++----------------------------------------------- block_int.h | 1 + cutils.c | 108 +++++++++++++++++++++++++ nbd.c | 80 +++++++++++++++++-- nbd.h | 20 ++++- oslib-posix.c | 7 ++ oslib-win32.c | 6 ++ qemu-common.h | 3 + qemu-coroutine.c | 71 ++++++++++++++++ qemu-coroutine.h | 26 ++++++ qemu-nbd.c | 13 ++-- qemu_socket.h | 1 + 14 files changed, 580 insertions(+), 269 deletions(-) -- 1.7.6