mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-10-05 13:05:45 +00:00
block_util: Enhance error reporting for virtio-block usage
There are multiple reports of DescriptorChainTooShort errors and so add some extra debugging to aid the debugging of this issue. Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
parent
27ba8133a4
commit
c4564f3ba8
@ -163,6 +163,7 @@ fn sector(mem: &GuestMemoryMmap, desc_addr: GuestAddress) -> result::Result<u64,
|
|||||||
mem.read_obj(addr).map_err(Error::GuestMemory)
|
mem.read_obj(addr).map_err(Error::GuestMemory)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
pub struct Request {
|
pub struct Request {
|
||||||
pub request_type: RequestType,
|
pub request_type: RequestType,
|
||||||
pub sector: u64,
|
pub sector: u64,
|
||||||
@ -192,12 +193,17 @@ impl Request {
|
|||||||
let status_desc;
|
let status_desc;
|
||||||
let mut desc = avail_desc
|
let mut desc = avail_desc
|
||||||
.next_descriptor()
|
.next_descriptor()
|
||||||
.ok_or(Error::DescriptorChainTooShort)?;
|
.ok_or(Error::DescriptorChainTooShort)
|
||||||
|
.map_err(|e| {
|
||||||
|
error!("Only head descriptor present: request = {:?}", req);
|
||||||
|
e
|
||||||
|
})?;
|
||||||
|
|
||||||
if !desc.has_next() {
|
if !desc.has_next() {
|
||||||
status_desc = desc;
|
status_desc = desc;
|
||||||
// Only flush requests are allowed to skip the data descriptor.
|
// Only flush requests are allowed to skip the data descriptor.
|
||||||
if req.request_type != RequestType::Flush {
|
if req.request_type != RequestType::Flush {
|
||||||
|
error!("Need a data descriptor: request = {:?}", req);
|
||||||
return Err(Error::DescriptorChainTooShort);
|
return Err(Error::DescriptorChainTooShort);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -214,7 +220,11 @@ impl Request {
|
|||||||
req.data_descriptors.push((desc.addr, desc.len));
|
req.data_descriptors.push((desc.addr, desc.len));
|
||||||
desc = desc
|
desc = desc
|
||||||
.next_descriptor()
|
.next_descriptor()
|
||||||
.ok_or(Error::DescriptorChainTooShort)?;
|
.ok_or(Error::DescriptorChainTooShort)
|
||||||
|
.map_err(|e| {
|
||||||
|
error!("DescriptorChain corrupted: request = {:?}", req);
|
||||||
|
e
|
||||||
|
})?;
|
||||||
}
|
}
|
||||||
status_desc = desc;
|
status_desc = desc;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user