mirror of
https://git.proxmox.com/git/proxmox-backup-qemu
synced 2025-10-04 22:11:27 +00:00
read_image_at: iterate until buffer is filled
QEMU will always assume EOF when less bytes than requested are returned by a block drivers 'read' interface, so we need to fill the buffer up to 'size' if possible. Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
This commit is contained in:
parent
8e63f0386d
commit
a9e0937c2d
@ -364,8 +364,8 @@ int proxmox_restore_read_image_at(ProxmoxRestoreHandle *handle,
|
|||||||
* Note: The data pointer needs to be valid until the async
|
* Note: The data pointer needs to be valid until the async
|
||||||
* opteration is finished.
|
* opteration is finished.
|
||||||
*
|
*
|
||||||
* Note: It is not an error for a successful call to transfer fewer
|
* Note: The call will only ever transfer less than 'size' bytes if
|
||||||
* bytes than requested.
|
* the end of the file has been reached.
|
||||||
*/
|
*/
|
||||||
void proxmox_restore_read_image_at_async(ProxmoxRestoreHandle *handle,
|
void proxmox_restore_read_image_at_async(ProxmoxRestoreHandle *handle,
|
||||||
uint8_t aid,
|
uint8_t aid,
|
||||||
|
@ -934,8 +934,8 @@ pub extern "C" fn proxmox_restore_read_image_at(
|
|||||||
/// Note: The data pointer needs to be valid until the async
|
/// Note: The data pointer needs to be valid until the async
|
||||||
/// opteration is finished.
|
/// opteration is finished.
|
||||||
///
|
///
|
||||||
/// Note: It is not an error for a successful call to transfer fewer
|
/// Note: The call will only ever transfer less than 'size' bytes if
|
||||||
/// bytes than requested.
|
/// the end of the file has been reached.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
#[allow(clippy::not_unsafe_ptr_arg_deref)]
|
#[allow(clippy::not_unsafe_ptr_arg_deref)]
|
||||||
pub extern "C" fn proxmox_restore_read_image_at_async(
|
pub extern "C" fn proxmox_restore_read_image_at_async(
|
||||||
|
@ -262,10 +262,22 @@ impl RestoreTask {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let mut reader = reader.lock().await;
|
let mut reader = reader.lock().await;
|
||||||
reader.seek(SeekFrom::Start(offset)).await?;
|
|
||||||
let buf: &mut [u8] = unsafe { std::slice::from_raw_parts_mut(data.0 as *mut u8, size as usize)};
|
|
||||||
let bytes = reader.read(buf).await?;
|
|
||||||
|
|
||||||
Ok(bytes.try_into()?)
|
let buf: &mut [u8] = unsafe { std::slice::from_raw_parts_mut(data.0 as *mut u8, size as usize)};
|
||||||
|
let mut read = 0;
|
||||||
|
|
||||||
|
while read < size {
|
||||||
|
reader.seek(SeekFrom::Start(offset + read)).await?;
|
||||||
|
let bytes = reader.read(&mut buf[read as usize..]).await?;
|
||||||
|
|
||||||
|
if bytes == 0 {
|
||||||
|
// EOF
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
read += bytes as u64;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(read.try_into()?)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user