mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
block_util: Align buffers for O_DIRECT
Whenever the backing file of our virtio-block device is opened with O_DIRECT, there's a requirement about the buffer address and size to be aligned to the sector size. We know virtio-block requests are sector aligned in terms of size, but we must still check if the buffer address is. In case it's not, we create an intermediate buffer that will be passed through the system call. In case of a write operation, the content of the non-aligned buffer must be copied beforehand, and in case of a read operation, the content of the aligned buffer must be copied to the non-aligned one after the operation has been completed. Fixes #3587 Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
committed by
Rob Bradford
parent
b4566b9eab
commit
85bbf75fe8
@@ -57,6 +57,8 @@ pub enum Error {
|
||||
RequestParsing(block_util::Error),
|
||||
/// Failed to execute the request.
|
||||
RequestExecuting(block_util::ExecuteError),
|
||||
/// Failed to complete the request.
|
||||
RequestCompleting(block_util::Error),
|
||||
/// Missing the expected entry in the list of requests.
|
||||
MissingEntryRequestList,
|
||||
/// The asynchronous request returned with failure.
|
||||
@@ -188,10 +190,11 @@ impl BlockEpollHandler {
|
||||
let completion_list = self.disk_image.complete();
|
||||
for (user_data, result) in completion_list {
|
||||
let desc_index = user_data as u16;
|
||||
let request = self
|
||||
let mut request = self
|
||||
.request_list
|
||||
.remove(&desc_index)
|
||||
.ok_or(Error::MissingEntryRequestList)?;
|
||||
request.complete_async().map_err(Error::RequestCompleting)?;
|
||||
|
||||
let (status, len) = if result >= 0 {
|
||||
match request.request_type {
|
||||
|
||||
Reference in New Issue
Block a user