in integrations/virtiofs/src/virtiofs_util.rs [58:97]
fn consume<F>(&mut self, count: usize, f: F) -> Result<usize>
where
F: FnOnce(&[&VolatileSlice<B>]) -> Result<usize>,
{
let mut len = 0;
let mut bufs = Vec::with_capacity(self.buffers.len());
for vs in &self.buffers {
if len >= count {
break;
}
bufs.push(vs);
let remain = count - len;
if remain < vs.len() {
len += remain;
} else {
len += vs.len();
}
}
if bufs.is_empty() {
return Ok(0);
}
let bytes_consumed = f(&bufs)?;
let total_bytes_consumed =
self.bytes_consumed
.checked_add(bytes_consumed)
.ok_or(new_vhost_user_fs_error(
"the combined length of all the buffers in DescriptorChain would overflow",
None,
))?;
let mut remain = bytes_consumed;
while let Some(vs) = self.buffers.pop_front() {
if remain < vs.len() {
self.buffers.push_front(vs.offset(remain).unwrap());
break;
}
remain -= vs.len();
}
self.bytes_consumed = total_bytes_consumed;
Ok(bytes_consumed)
}