Acknowledge this and forcefully set BDRV_O_NOCACHE and O_DIRECT in order to force QEMU to use aligned buffers.
Signed-off-by: Roger Pau Monné <roger....@citrix.com> Cc: Kevin Wolf <kw...@redhat.com> Cc: Stefan Hajnoczi <stefa...@redhat.com> --- block/raw-posix.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/block/raw-posix.c b/block/raw-posix.c index 86ce4f2..63841dd 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -472,6 +472,18 @@ static int raw_open_common(BlockDriverState *bs, QDict *options, } #endif } +#ifdef __FreeBSD__ + if (S_ISCHR(st.st_mode)) { + /* + * The file is a char device (disk), which on FreeBSD isn't behind + * a pager, so set BDRV_O_NOCACHE unconditionally. This is needed + * so Qemu makes sure all IO operations on the device are aligned + * to sector size, or else FreeBSD will reject them with EINVAL. + */ + bs->open_flags |= BDRV_O_NOCACHE; + s->open_flags |= O_DIRECT; + } +#endif #ifdef CONFIG_XFS if (platform_test_xfs_fd(s->fd)) { -- 1.9.3 (Apple Git-50)