mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
block: Fall back to write when fallocate returns EOPNOTSUPP
Filesystems such as tmpfs do not support fallocate with FALLOC_FL_ZERO_RANGE or FALLOC_FL_PUNCH_HOLE and return EOPNOTSUPP. When a raw disk image lives on such a filesystem, virtio write zeroes and discard requests fail with IOERR. Use the WriteZeroesAt trait from vmm_sys_util through AlignedFile, which already bundles fallocate with a positional write fallback. For punch_hole, catch EOPNOTSUPP and fall back to the same trait. The io_uring engine previously submitted fallocate directly through the ring, where the async EOPNOTSUPP completion had no retry path. Route it through the same sync helpers that the other engines already use. Signed-off-by: Anatol Belski <anbelski@linux.microsoft.com>
This commit is contained in:
committed by
Rob Bradford
parent
e37f63282c
commit
d7a7d73622
@@ -94,13 +94,8 @@ impl AsyncIo for RawAio {
|
||||
// Linux AIO has no IOCB command for fallocate, so perform the
|
||||
// operation synchronously and signal completion via the completion
|
||||
// list, matching the pattern used by the sync backend (RawSync).
|
||||
punch_hole(
|
||||
self.raw_file.as_raw_fd(),
|
||||
self.is_block_device,
|
||||
offset,
|
||||
length,
|
||||
)
|
||||
.map_err(AsyncIoError::PunchHole)?;
|
||||
punch_hole(&mut self.raw_file, self.is_block_device, offset, length)
|
||||
.map_err(AsyncIoError::PunchHole)?;
|
||||
self.data_io
|
||||
.inject_completion(AsyncIoCompletion::new(user_data, 0, None));
|
||||
|
||||
@@ -109,13 +104,8 @@ impl AsyncIo for RawAio {
|
||||
|
||||
fn write_zeroes(&mut self, offset: u64, length: u64, user_data: u64) -> AsyncIoResult<()> {
|
||||
// Same as punch_hole().
|
||||
write_zeroes(
|
||||
self.raw_file.as_raw_fd(),
|
||||
self.is_block_device,
|
||||
offset,
|
||||
length,
|
||||
)
|
||||
.map_err(AsyncIoError::WriteZeroes)?;
|
||||
write_zeroes(&mut self.raw_file, self.is_block_device, offset, length)
|
||||
.map_err(AsyncIoError::WriteZeroes)?;
|
||||
self.data_io
|
||||
.inject_completion(AsyncIoCompletion::new(user_data, 0, None));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user