From: Stefan Hajnoczi Date: Tue, 7 Oct 2025 14:16:58 +0000 (-0400) Subject: file-posix: populate pwrite_zeroes_alignment X-Git-Tag: v10.2.0-rc2~5^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=98e788b91ad037193b1fb375561ef7e0fef3c2fd;p=thirdparty%2Fqemu.git file-posix: populate pwrite_zeroes_alignment 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: qemu-stable@nongnu.org Signed-off-by: Stefan Hajnoczi Message-ID: <20251007141700.71891-2-stefanha@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy Tested-by: Fiona Ebner Reviewed-by: Fiona Ebner Reviewed-by: Kevin Wolf Signed-off-by: Kevin Wolf --- diff --git a/block/file-posix.c b/block/file-posix.c index 12d12970fa..c9e367a222 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -1611,6 +1611,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);