I was digging QEMU's code base to see how 'qemu-img convert' ends up calling fsync(2). See the number of calls involved: - In block/io.c, we begin with: bdrv_flush() --> bdrv_flush_co_entry() --> bdrv_co_flush(). - Then: bdrv_co_flush() --> bdrv_co_flush_to_disk() --> raw_co_flush_to_disk(), which sets handle_aiocb_flush() as a callback function. - And finally: handle_aiocb_flush() --> qemu_fdatasync() --> fsync(2).