1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#[cfg(not(feature = "virtiofs"))]
pub trait FsCacheReqHandler {}
#[cfg(feature = "virtiofs")]
pub use virtiofs::FsCacheReqHandler;
#[cfg(feature = "virtiofs")]
mod virtiofs {
use std::io;
use std::os::unix::io::RawFd;
#[cfg(feature = "vhost-user-fs")]
use vhost::vhost_user::message::{
VhostUserFSSlaveMsg, VhostUserFSSlaveMsgFlags, VHOST_USER_FS_SLAVE_ENTRIES,
};
#[cfg(feature = "vhost-user-fs")]
use vhost::vhost_user::{SlaveFsCacheReq, VhostUserMasterReqHandler};
use crate::abi::virtio_fs::RemovemappingOne;
#[cfg(feature = "vhost-user-fs")]
use crate::abi::virtio_fs::SetupmappingFlags;
pub trait FsCacheReqHandler: Send + Sync + 'static {
fn map(
&mut self,
foffset: u64,
moffset: u64,
len: u64,
flags: u64,
fd: RawFd,
) -> io::Result<()>;
fn unmap(&mut self, requests: Vec<RemovemappingOne>) -> io::Result<()>;
}
#[cfg(feature = "vhost-user-fs")]
impl FsCacheReqHandler for SlaveFsCacheReq {
fn map(
&mut self,
foffset: u64,
moffset: u64,
len: u64,
flags: u64,
fd: RawFd,
) -> io::Result<()> {
let mut msg: VhostUserFSSlaveMsg = Default::default();
msg.fd_offset[0] = foffset;
msg.cache_offset[0] = moffset;
msg.len[0] = len;
msg.flags[0] = if (flags & SetupmappingFlags::WRITE.bits()) != 0 {
VhostUserFSSlaveMsgFlags::MAP_W | VhostUserFSSlaveMsgFlags::MAP_R
} else {
VhostUserFSSlaveMsgFlags::MAP_R
};
self.fs_slave_map(&msg, &fd)?;
Ok(())
}
fn unmap(&mut self, requests: Vec<RemovemappingOne>) -> io::Result<()> {
for chunk in requests.chunks(VHOST_USER_FS_SLAVE_ENTRIES) {
let mut msg: VhostUserFSSlaveMsg = Default::default();
for (ind, req) in chunk.iter().enumerate() {
msg.len[ind] = req.len;
msg.cache_offset[ind] = req.moffset;
}
self.fs_slave_unmap(&msg)?;
}
Ok(())
}
}
}