block: virtio-devices: block: Clarify the return of execute_async()

Instead of returning boolean return an struct of completion status
so that it can be cached for batch submission.

Signed-off-by: Bo Chen <bchen@crusoe.ai>
Signed-off-by: Muminul Islam <muislam@microsoft.com>
This commit is contained in:
Muminul Islam
2025-08-13 00:21:50 +00:00
committed by Bo Chen
parent 8b2af1a2c8
commit 67ab81874a
2 changed files with 20 additions and 5 deletions

View File

@@ -232,6 +232,11 @@ pub struct AlignedOperation {
layout: Layout,
}
pub struct ExecuteAsync {
// `true` if the execution will complete asynchronously
pub async_complete: bool,
}
#[derive(Debug)]
pub struct Request {
pub request_type: RequestType,
@@ -397,7 +402,7 @@ impl Request {
disk_image: &mut dyn AsyncIo,
serial: &[u8],
user_data: u64,
) -> result::Result<bool, ExecuteError> {
) -> result::Result<ExecuteAsync, ExecuteError> {
let sector = self.sector;
let request_type = self.request_type;
let offset = (sector << SECTOR_SHIFT) as libc::off_t;
@@ -473,6 +478,9 @@ impl Request {
iovecs.push(iovec);
}
let mut ret = ExecuteAsync {
async_complete: true,
};
// Queue operations expected to be submitted.
match request_type {
RequestType::In => {
@@ -507,12 +515,13 @@ impl Request {
}
mem.write_slice(serial, data_addr)
.map_err(ExecuteError::Write)?;
return Ok(false);
ret.async_complete = false;
return Ok(ret);
}
RequestType::Unsupported(t) => return Err(ExecuteError::Unsupported(t)),
}
Ok(true)
Ok(ret)
}
pub fn complete_async(&mut self) -> result::Result<(), Error> {

View File

@@ -20,7 +20,9 @@ use std::{io, result};
use anyhow::anyhow;
use block::async_io::{AsyncIo, AsyncIoError, DiskFile};
use block::fcntl::{get_lock_state, LockError, LockType};
use block::{build_serial, fcntl, ExecuteError, Request, RequestType, VirtioBlockConfig};
use block::{
build_serial, fcntl, ExecuteAsync, ExecuteError, Request, RequestType, VirtioBlockConfig,
};
use rate_limiter::group::{RateLimiterGroup, RateLimiterGroupHandle};
use rate_limiter::TokenType;
use seccompiler::SeccompAction;
@@ -232,7 +234,11 @@ impl BlockEpollHandler {
desc_chain.head_index() as u64,
);
if let Ok(true) = result {
if let Ok(ExecuteAsync {
async_complete: true,
..
}) = result
{
self.inflight_requests
.push_back((desc_chain.head_index(), request));
} else {