From: Stefan Hajnoczi <[email protected]> Linux block devices require write zeroes alignment whereas files do not.
It may come as a surprise that block devices opened in buffered I/O mode require the alignment for write zeroes requests although normal read/write requests do not. Therefore it is necessary to populate the pwrite_zeroes_alignment field. Cc: [email protected] Signed-off-by: Stefan Hajnoczi <[email protected]> Message-ID: <[email protected]> Reviewed-by: Vladimir Sementsov-Ogievskiy <[email protected]> Tested-by: Fiona Ebner <[email protected]> Reviewed-by: Fiona Ebner <[email protected]> Reviewed-by: Kevin Wolf <[email protected]> Signed-off-by: Kevin Wolf <[email protected]> (cherry picked from commit 98e788b91ad037193b1fb375561ef7e0fef3c2fd) Signed-off-by: Michael Tokarev <[email protected]> diff --git a/block/file-posix.c b/block/file-posix.c index 8c738674ce..827ffa77a5 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -1602,6 +1602,22 @@ static void raw_refresh_limits(BlockDriverState *bs, Error **errp) bs->bl.pdiscard_alignment = dalign; } + +#ifdef __linux__ + /* + * Linux requires logical block size alignment for write zeroes even + * when normal reads/writes do not require alignment. + */ + if (!s->needs_alignment) { + ret = probe_logical_blocksize(s->fd, + &bs->bl.pwrite_zeroes_alignment); + if (ret < 0) { + error_setg_errno(errp, -ret, + "Failed to probe logical block size"); + return; + } + } +#endif /* __linux__ */ } raw_refresh_zoned_limits(bs, &st, errp); -- 2.47.3
