mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2025-03-20 07:58:55 +00:00
vm-virtio: block: Add "writeback" control to Request
When this is set to false the write needs to be followed by a flush on the underlying disk (leading to a fsync()). The default behaviour is not changed with this change. Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
parent
b94d9a30d3
commit
10db2131bd
@ -479,6 +479,7 @@ pub struct Request {
|
|||||||
data_addr: GuestAddress,
|
data_addr: GuestAddress,
|
||||||
data_len: u32,
|
data_len: u32,
|
||||||
pub status_addr: GuestAddress,
|
pub status_addr: GuestAddress,
|
||||||
|
writeback: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Request {
|
impl Request {
|
||||||
@ -497,6 +498,7 @@ impl Request {
|
|||||||
data_addr: GuestAddress(0),
|
data_addr: GuestAddress(0),
|
||||||
data_len: 0,
|
data_len: 0,
|
||||||
status_addr: GuestAddress(0),
|
status_addr: GuestAddress(0),
|
||||||
|
writeback: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
let data_desc;
|
let data_desc;
|
||||||
@ -576,13 +578,11 @@ impl Request {
|
|||||||
RequestType::Out => {
|
RequestType::Out => {
|
||||||
mem.write_all_to(self.data_addr, disk, self.data_len as usize)
|
mem.write_all_to(self.data_addr, disk, self.data_len as usize)
|
||||||
.map_err(ExecuteError::Write)?;
|
.map_err(ExecuteError::Write)?;
|
||||||
}
|
if !self.writeback {
|
||||||
RequestType::Flush => match disk.flush() {
|
disk.flush().map_err(ExecuteError::Flush)?;
|
||||||
Ok(_) => {
|
|
||||||
return Ok(0);
|
|
||||||
}
|
}
|
||||||
Err(e) => return Err(ExecuteError::Flush(e)),
|
}
|
||||||
},
|
RequestType::Flush => disk.flush().map_err(ExecuteError::Flush)?,
|
||||||
RequestType::GetDeviceID => {
|
RequestType::GetDeviceID => {
|
||||||
if (self.data_len as usize) < disk_id.len() {
|
if (self.data_len as usize) < disk_id.len() {
|
||||||
return Err(ExecuteError::BadRequest(Error::InvalidOffset));
|
return Err(ExecuteError::BadRequest(Error::InvalidOffset));
|
||||||
@ -594,6 +594,10 @@ impl Request {
|
|||||||
};
|
};
|
||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_writeback(&mut self, writeback: bool) {
|
||||||
|
self.writeback = writeback
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct BlockEpollHandler<T: DiskFile> {
|
struct BlockEpollHandler<T: DiskFile> {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user