Migrate nvmed to schemev2.

This commit is contained in:
4lDO2
2024-06-11 21:05:14 +02:00
parent 0ccf87f357
commit 9dee2c12ae
5 changed files with 23 additions and 26 deletions
Generated
+2
View File
@@ -787,6 +787,8 @@ dependencies = [
"pcid",
"redox-daemon",
"redox-log",
"redox-scheme",
"redox_event",
"redox_syscall 0.5.1",
"smallvec 1.13.2",
]
+1 -1
View File
@@ -9,7 +9,7 @@ byteorder = "1.2"
log = "0.4"
redox-daemon = "0.1"
redox-log = "0.1"
redox_syscall = "0.5"
redox_syscall = { version = "0.5", features = ["std"] }
common = { path = "../../common" }
driver-block = { path = "../driver-block" }
+3 -1
View File
@@ -11,7 +11,9 @@ futures = "0.3"
log = "0.4"
redox-daemon = "0.1"
redox-log = "0.1"
redox_syscall = "0.5"
redox_syscall = { version = "0.5", features = ["std"] }
redox-scheme = { git = "https://gitlab.redox-os.org/4lDO2/redox-scheme.git", branch = "schemev2" }
redox_event = "0.4"
partitionlib = { git = "https://gitlab.redox-os.org/redox-os/partitionlib.git" }
smallvec = "1"
+14 -22
View File
@@ -11,6 +11,7 @@ use std::{slice, usize};
use libredox::flag;
use pcid_interface::{PciFeature, PciFeatureInfo, PciFunction, PcidServerHandle};
use redox_scheme::{CallRequest, RequestKind, SignalBehavior, Socket, V2};
use syscall::{
Event, Mmio, Packet, Result, SchemeBlockMut,
PAGE_SIZE,
@@ -278,13 +279,7 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! {
ptr: NonNull::new(address as *mut u8).expect("Physmapping BAR gave nullptr"),
});
let socket_fd = libredox::call::open(
&format!(":{}", scheme_name),
flag::O_RDWR | flag::O_CREAT | flag::O_CLOEXEC,
0,
)
.expect("nvmed: failed to create disk scheme");
let mut socket_file = unsafe { File::from_raw_fd(socket_fd as RawFd) };
let socket = Socket::<V2>::create(&scheme_name).expect("nvmed: failed to create disk scheme");
daemon.ready().expect("nvmed: failed to signal readiness");
@@ -306,27 +301,24 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! {
let mut scheme = DiskScheme::new(scheme_name, nvme, namespaces);
let mut todo = Vec::new();
loop {
let mut packet = Packet::default();
match socket_file.read(&mut packet) {
Ok(0) => {
// TODO: Use a proper event queue once interrupt support is back.
match socket.next_request(SignalBehavior::Restart).expect("nvmed: failed to read disk scheme") {
None => {
break;
},
Ok(_) => {
todo.push(packet);
},
Err(err) => match err.kind() {
ErrorKind::WouldBlock => break,
_ => Err(err).expect("nvmed: failed to read disk scheme"),
},
Some(req) => if let RequestKind::Call(c) = req.kind() {
todo.push(c);
} else {
// TODO: cancellation
continue;
}
}
let mut i = 0;
while i < todo.len() {
if let Some(a) = scheme.handle(&todo[i]) {
let mut packet = todo.remove(i);
packet.a = a;
socket_file
.write(&packet)
if let Some(resp) = todo[i].handle_scheme_block_mut(&mut scheme) {
let _req = todo.remove(i);
socket.write_response(resp, SignalBehavior::Restart)
.expect("nvmed: failed to write disk scheme");
} else {
i += 1;
+3 -2
View File
@@ -7,9 +7,10 @@ use std::sync::Arc;
use std::{cmp, str};
use syscall::{
Error, Io, Result, SchemeBlockMut, Stat, EACCES, EBADF, EINVAL, EISDIR, ENOENT, ENOLCK,
EOVERFLOW, MODE_DIR, MODE_FILE, O_DIRECTORY, O_STAT, SEEK_CUR, SEEK_END, SEEK_SET,
Error, Io, Result, Stat, EACCES, EBADF, EINVAL, EISDIR, ENOENT, ENOLCK, EOVERFLOW, MODE_DIR,
MODE_FILE, O_DIRECTORY, O_STAT, SEEK_CUR, SEEK_END, SEEK_SET,
};
use redox_scheme::SchemeBlockMut;
use crate::nvme::{Nvme, NvmeNamespace};