diff --git a/Cargo.lock b/Cargo.lock index cee523d05a..2032af2703 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -787,6 +787,8 @@ dependencies = [ "pcid", "redox-daemon", "redox-log", + "redox-scheme", + "redox_event", "redox_syscall 0.5.1", "smallvec 1.13.2", ] diff --git a/storage/ahcid/Cargo.toml b/storage/ahcid/Cargo.toml index 746a660bc3..661f28e2c4 100644 --- a/storage/ahcid/Cargo.toml +++ b/storage/ahcid/Cargo.toml @@ -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" } diff --git a/storage/nvmed/Cargo.toml b/storage/nvmed/Cargo.toml index 7306d843c3..9b8eed9cec 100644 --- a/storage/nvmed/Cargo.toml +++ b/storage/nvmed/Cargo.toml @@ -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" diff --git a/storage/nvmed/src/main.rs b/storage/nvmed/src/main.rs index 4aee22d621..39167633d2 100644 --- a/storage/nvmed/src/main.rs +++ b/storage/nvmed/src/main.rs @@ -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::::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; diff --git a/storage/nvmed/src/scheme.rs b/storage/nvmed/src/scheme.rs index 638b426ae4..71944e9712 100644 --- a/storage/nvmed/src/scheme.rs +++ b/storage/nvmed/src/scheme.rs @@ -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};