From 726fb9863385b9b3b87bebe4185acb7a21015172 Mon Sep 17 00:00:00 2001 From: Alex Sayers Date: Sat, 29 Mar 2025 17:41:38 +0900 Subject: [PATCH 1/3] cqueue: Return an io::Result from Entry::result() Quick access to the raw i32 is still possible via the `raw_result()` method. The same change is applied to `Entry32` to keep the APIs in-sync. --- src/cqueue.rs | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/src/cqueue.rs b/src/cqueue.rs index 45921086..765bb82a 100644 --- a/src/cqueue.rs +++ b/src/cqueue.rs @@ -1,9 +1,9 @@ //! Completion Queue use std::fmt::{self, Debug}; -use std::mem; use std::mem::MaybeUninit; use std::sync::atomic; +use std::{io, mem}; use crate::sys; use crate::util::{private, unsync_load, Mmap}; @@ -192,10 +192,32 @@ impl ExactSizeIterator for CompletionQueue<'_, E> { } impl Entry { + /// The result of the operation. If the operation succeeded, this is the operation-specific + /// return value. For example, for a [`Read`](crate::opcode::Read) operation this is + /// equivalent to the return value of the `read(2)` system call. If the operation failed, the + /// errno is returned. + #[inline] + pub fn result(&self) -> io::Result { + // The following text is found in many io_uring man pages: + // + // > Note that where synchronous system calls will return -1 on failure + // > and set errno to the actual error value, io_uring never uses errno. + // > Instead it returns the negated errno directly in the CQE res field. + // + // Furthermore, I believe a negative value in the `res` field is + // _always_ a negated errno. We return a `Result` instead for + // convenience. + if let Ok(x) = u32::try_from(self.0.res) { + Ok(x) + } else { + Err(io::Error::from_raw_os_error(-self.0.res)) + } + } + /// The operation-specific result code. For example, for a [`Read`](crate::opcode::Read) /// operation this is equivalent to the return value of the `read(2)` system call. #[inline] - pub fn result(&self) -> i32 { + pub fn raw_result(&self) -> i32 { self.0.res } @@ -241,10 +263,24 @@ impl Debug for Entry { } impl Entry32 { + /// The result of the operation. If the operation succeeded, this is the operation-specific + /// return value. For example, for a [`Read`](crate::opcode::Read) operation this is + /// equivalent to the return value of the `read(2)` system call. If the operation failed, the + /// errno is returned. + #[inline] + pub fn result(&self) -> io::Result { + // See Entry::result() for the justification for this logic. + if let Ok(x) = u32::try_from(self.0 .0.res) { + Ok(x) + } else { + Err(io::Error::from_raw_os_error(-self.0 .0.res)) + } + } + /// The operation-specific result code. For example, for a [`Read`](crate::opcode::Read) /// operation this is equivalent to the return value of the `read(2)` system call. #[inline] - pub fn result(&self) -> i32 { + pub fn raw_result(&self) -> i32 { self.0 .0.res } From 37780fa5a8d34bb78d7c0acd463ca5d9bd3c7a5a Mon Sep 17 00:00:00 2001 From: Alex Sayers Date: Wed, 2 Apr 2025 21:44:21 +0900 Subject: [PATCH 2/3] examples,README: Expect cqueue::Entry::result() to be Result --- README.md | 2 +- examples/readme.rs | 2 +- examples/tcp_echo.rs | 20 +++++++++----------- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 901324ae..8d854128 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ fn main() -> io::Result<()> { let cqe = ring.completion().next().expect("completion queue is empty"); assert_eq!(cqe.user_data(), 0x42); - assert!(cqe.result() >= 0, "read error: {}", cqe.result()); + let _bytes_read = cqe.result().expect("read error"); Ok(()) } diff --git a/examples/readme.rs b/examples/readme.rs index 56db6a43..7187ecc1 100644 --- a/examples/readme.rs +++ b/examples/readme.rs @@ -25,7 +25,7 @@ fn main() -> io::Result<()> { let cqe = ring.completion().next().expect("completion queue is empty"); assert_eq!(cqe.user_data(), 0x42); - assert!(cqe.result() >= 0, "read error: {}", cqe.result()); + let _bytes_read = cqe.result().expect("read error"); Ok(()) } diff --git a/examples/tcp_echo.rs b/examples/tcp_echo.rs index 6c6cf533..060c2389 100644 --- a/examples/tcp_echo.rs +++ b/examples/tcp_echo.rs @@ -1,7 +1,7 @@ use std::collections::VecDeque; use std::net::TcpListener; use std::os::unix::io::{AsRawFd, RawFd}; -use std::{io, ptr}; +use std::ptr; use io_uring::{opcode, squeue, types, IoUring, SubmissionQueue}; use slab::Slab; @@ -100,17 +100,15 @@ fn main() -> anyhow::Result<()> { accept.push_to(&mut sq); for cqe in &mut cq { - let ret = cqe.result(); let token_index = cqe.user_data() as usize; - if ret < 0 { - eprintln!( - "token {:?} error: {:?}", - token_alloc.get(token_index), - io::Error::from_raw_os_error(-ret) - ); - continue; - } + let ret = match cqe.result() { + Ok(x) => x, + Err(e) => { + eprintln!("token {:?} error: {e:?}", token_alloc.get(token_index),); + continue; + } + }; let token = &mut token_alloc[token_index]; match token.clone() { @@ -119,7 +117,7 @@ fn main() -> anyhow::Result<()> { accept.count += 1; - let fd = ret; + let fd = ret as i32; let poll_token = token_alloc.insert(Token::Poll { fd }); let poll_e = opcode::PollAdd::new(types::Fd(fd), libc::POLLIN as _) From 02107a797c599feb1b3b5857ecaf196d27b6a87e Mon Sep 17 00:00:00 2001 From: Alex Sayers Date: Mon, 15 Dec 2025 11:26:47 +0900 Subject: [PATCH 3/3] io-uring-test: Expect cqueue::Entry::result() to be Result --- io-uring-test/src/tests/cancel.rs | 50 +++-- io-uring-test/src/tests/epoll.rs | 15 +- io-uring-test/src/tests/fs.rs | 103 ++++----- io-uring-test/src/tests/futex.rs | 6 +- io-uring-test/src/tests/net.rs | 195 ++++++++++-------- io-uring-test/src/tests/os.rs | 2 +- io-uring-test/src/tests/pipe.rs | 2 +- io-uring-test/src/tests/poll.rs | 20 +- io-uring-test/src/tests/queue.rs | 16 +- io-uring-test/src/tests/register_buf_ring.rs | 10 +- io-uring-test/src/tests/register_buffers.rs | 17 +- .../src/tests/register_sync_cancel.rs | 40 +++- io-uring-test/src/tests/timeout.rs | 56 +++-- io-uring-test/src/utils.rs | 10 +- 14 files changed, 319 insertions(+), 223 deletions(-) diff --git a/io-uring-test/src/tests/cancel.rs b/io-uring-test/src/tests/cancel.rs index c762f384..ec29a65b 100644 --- a/io-uring-test/src/tests/cancel.rs +++ b/io-uring-test/src/tests/cancel.rs @@ -46,8 +46,11 @@ pub fn test_async_cancel_user_data( assert_eq!(cqes[1].user_data(), 2004); assert_eq!(cqes[2].user_data(), 2005); - assert_eq!(cqes[0].result(), -libc::ECANCELED); // -ECANCELED - assert_eq!(cqes[1].result(), -libc::ECANCELED); - assert_eq!(cqes[2].result(), 2); // the number of requests cancelled + assert_eq!( + cqes[0].result().unwrap_err().raw_os_error().unwrap(), + libc::ECANCELED + ); // -ECANCELED + assert_eq!( + cqes[1].result().unwrap_err().raw_os_error().unwrap(), + libc::ECANCELED + ); + assert_eq!(cqes[2].result().unwrap(), 2); // the number of requests cancelled Ok(()) } @@ -196,8 +211,11 @@ pub fn test_async_cancel_fd( assert_eq!(cqes[0].user_data(), 2003); assert_eq!(cqes[1].user_data(), 2004); - assert_eq!(cqes[0].result(), -libc::ECANCELED); // -ECANCELED - assert_eq!(cqes[1].result(), 0); + assert_eq!( + cqes[0].result().unwrap_err().raw_os_error().unwrap(), + libc::ECANCELED + ); // -ECANCELED + assert_eq!(cqes[1].result().unwrap(), 0); Ok(()) } @@ -247,9 +265,15 @@ pub fn test_async_cancel_fd_all( assert_eq!(cqes[1].user_data(), 2004); assert_eq!(cqes[2].user_data(), 2005); - assert_eq!(cqes[0].result(), -libc::ECANCELED); // -ECANCELED - assert_eq!(cqes[1].result(), -libc::ECANCELED); - assert_eq!(cqes[2].result(), 2); // the number of requests cancelled + assert_eq!( + cqes[0].result().unwrap_err().raw_os_error().unwrap(), + libc::ECANCELED + ); // -ECANCELED + assert_eq!( + cqes[1].result().unwrap_err().raw_os_error().unwrap(), + libc::ECANCELED + ); + assert_eq!(cqes[2].result().unwrap(), 2); // the number of requests cancelled Ok(()) } diff --git a/io-uring-test/src/tests/epoll.rs b/io-uring-test/src/tests/epoll.rs index 28cdf312..06cba66b 100644 --- a/io-uring-test/src/tests/epoll.rs +++ b/io-uring-test/src/tests/epoll.rs @@ -61,7 +61,7 @@ pub fn test_ready( .next() .unwrap(); assert_eq!(cqe.user_data(), REQ_TYPE_EPOLL_WAIT); - assert_eq!(cqe.result(), 2); + assert_eq!(cqe.result().unwrap(), 2); // read @@ -114,8 +114,8 @@ pub fn test_not_ready( ring.submit_and_wait(1)?; for cqe in ring.completion().map(Into::::into).take(1) { assert_eq!(cqe.user_data(), REQ_TYPE_EPOLL_WAIT); - assert!(0 <= cqe.result() && cqe.result() <= 2); - nr = cqe.result(); + assert!(cqe.result().unwrap() <= 2); + nr = cqe.result().unwrap(); } // read @@ -186,7 +186,7 @@ pub fn test_delete( for cqe in ring.completion().map(Into::::into).take(1) { assert_eq!(cqe.user_data(), REQ_TYPE_EPOLL_WAIT); // check for only one event - assert!(cqe.result() == 1); + assert_eq!(cqe.result().unwrap(), 1); } // check that both writes still happened @@ -261,9 +261,9 @@ pub fn test_remove( ring.submit_and_wait(1)?; for cqe in ring.completion().map(Into::::into).take(1) { assert_eq!(cqe.user_data(), REQ_TYPE_EPOLL_WAIT); - let err = cqe.result(); + let err = cqe.result().unwrap_err().raw_os_error().unwrap(); // check that we got the expected errors - assert!([-::libc::EAGAIN, -::libc::EBADF].contains(&err)); + assert!([libc::EAGAIN, libc::EBADF].contains(&err)); } Ok(()) @@ -342,8 +342,7 @@ pub fn test_race( .map(Into::::into) .unwrap(); assert_eq!(cqe.user_data(), REQ_TYPE_EPOLL_WAIT); - assert!(cqe.result() >= 0); - let nr = cqe.result(); + let nr = cqe.result().unwrap(); // process the events prune_read(&mut readers, &events, nr as _)?; diff --git a/io-uring-test/src/tests/fs.rs b/io-uring-test/src/tests/fs.rs index cc73090a..cf15410f 100644 --- a/io-uring-test/src/tests/fs.rs +++ b/io-uring-test/src/tests/fs.rs @@ -89,8 +89,7 @@ pub fn test_pipe_read_multishot( got_reads = 0; got_bufs = BTreeSet::new(); for cqe in ring.completion().map(Into::::into) { - assert!(cqe.result() >= 0); - let len = cqe.result().cast_unsigned(); + let len = cqe.result().unwrap(); match cqe.user_data() { REQ_TYPE_WRITE_BYTES0 => { assert_eq!(BYTES0.len(), len as _); @@ -133,8 +132,7 @@ pub fn test_pipe_read_multishot( got_reads = 0; got_bufs = BTreeSet::new(); for cqe in ring.completion().map(Into::::into) { - assert!(cqe.result() >= 0); - let len = cqe.result().cast_unsigned(); + let len = cqe.result().unwrap(); match cqe.user_data() { REQ_TYPE_WRITE_BYTES1 => { assert_eq!(BYTES1.len(), len as _); @@ -186,8 +184,7 @@ pub fn test_pipe_read_multishot( got_reads = 0; got_bufs = BTreeSet::new(); for cqe in ring.completion().map(Into::::into) { - assert!(cqe.result() >= 0); - let len = cqe.result().cast_unsigned(); + let len = cqe.result().unwrap(); match cqe.user_data() { REQ_TYPE_WRITE_BYTES0 => { assert_eq!(BYTES0.len(), len as _); @@ -238,8 +235,7 @@ pub fn test_pipe_read_multishot( assert_eq!(1, completions.len()); let cqe = completions.next().unwrap(); - assert!(cqe.result() >= 0); - let len = cqe.result().cast_unsigned(); + let len = cqe.result().unwrap(); assert_eq!(0, len); assert_eq!(REQ_TYPE_READ, cqe.user_data()); assert!(!cqueue::more(cqe.flags())); @@ -334,8 +330,7 @@ pub fn test_pipe_fixed_writev_readv::into) { assert_eq!(cqe.user_data(), REQ_TYPE_WRITEV_FIXED); - assert!(cqe.result() >= 0); - let len = cqe.result(); + let len = cqe.result().unwrap(); assert_eq!(len, src.len() as _); } @@ -365,8 +360,7 @@ pub fn test_pipe_fixed_writev_readv::into) { assert_eq!(cqe.user_data(), REQ_TYPE_READV_FIXED); - assert!(cqe.result() >= 0); - let len = cqe.result(); + let len = cqe.result().unwrap(); assert_eq!(len, src.len() as _); } @@ -408,7 +402,7 @@ pub fn test_file_fsync( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x03); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); Ok(()) } @@ -446,7 +440,7 @@ pub fn test_file_fsync_file_range( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x10); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); Ok(()) } @@ -518,9 +512,9 @@ pub fn test_file_openat2( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x11); - assert!(cqes[0].result() > 0); + assert!(cqes[0].result().unwrap() > 0); - let fd = unsafe { fs::File::from_raw_fd(cqes[0].result()) }; + let fd = unsafe { fs::File::from_raw_fd(cqes[0].result().unwrap() as i32) }; assert!(fd.metadata()?.is_file()); @@ -579,9 +573,9 @@ pub fn test_file_openat2_close_file_index( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x12); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); Ok(()) } @@ -896,9 +890,9 @@ pub fn test_file_cur_pos( assert_eq!(cqes[0].user_data(), 0x01); assert_eq!(cqes[1].user_data(), 0x02); assert_eq!(cqes[2].user_data(), 0x03); - assert_eq!(cqes[0].result(), 22); - assert_eq!(cqes[1].result(), 22); - assert_eq!(cqes[2].result(), text.len() as i32); + assert_eq!(cqes[0].result().unwrap(), 22); + assert_eq!(cqes[1].result().unwrap(), 22); + assert_eq!(cqes[2].result().unwrap(), text.len() as u32); assert_eq!(&output, text); @@ -944,7 +938,7 @@ pub fn test_statx( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x99); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); // check let mut statxbuf2 = unsafe { std::mem::zeroed() }; @@ -986,7 +980,7 @@ pub fn test_statx( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x9a); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); assert_eq!(statxbuf3, statxbuf2); @@ -1049,8 +1043,8 @@ pub fn test_file_direct_write_read( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x33); - assert_eq!(cqes[0].result(), 1024); + assert_eq!(cqes[0].result().unwrap(), 1024); let mut output = [0; 1024]; pipe_out.read_exact(&mut output)?; @@ -1175,7 +1172,7 @@ pub fn test_ftruncate( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x33); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); assert_eq!( fs::read(&file).expect("could not read truncated file"), &input[..512] @@ -1195,7 +1192,7 @@ pub fn test_ftruncate( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x34); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); assert_eq!( fs::metadata(&file) .expect("could not read truncated file") @@ -1242,7 +1239,7 @@ pub fn test_fixed_fd_install( let cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x01); - assert_eq!(cqes[0].result(), 1024); + assert_eq!(cqes[0].result().unwrap(), 1024); assert_eq!(output, input); let fixed_fd_install_e = opcode::FixedFdInstall::new(fd, 0); @@ -1259,9 +1256,9 @@ pub fn test_fixed_fd_install( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x02); - let fd = cqes[0].result(); + let fd = cqes[0].result().unwrap(); assert!(fd > 0); - let mut file = unsafe { fs::File::from_raw_fd(fd) }; + let mut file = unsafe { fs::File::from_raw_fd(fd as i32) }; file.read_exact(&mut output)?; assert_eq!(output, input); @@ -1311,7 +1308,7 @@ pub fn test_get_set_xattr( let cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x01); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); // Get extended attribute let getxattr_e = opcode::GetXattr::new( @@ -1333,9 +1330,12 @@ pub fn test_get_set_xattr( let cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x02); - assert_eq!(cqes[0].result(), attr_value.as_bytes().len() as i32); + assert_eq!( + cqes[0].result().unwrap(), + attr_value.as_bytes().len() as u32 + ); - let retrieved_value = CString::new(&buffer[..cqes[0].result() as usize])?; + let retrieved_value = CString::new(&buffer[..cqes[0].result().unwrap() as usize])?; assert_eq!(retrieved_value, attr_value); Ok(()) @@ -1381,7 +1381,7 @@ pub fn test_f_get_set_xattr( let cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x01); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); // Get extended attribute from file descriptor let fgetxattr_e = opcode::FGetXattr::new( @@ -1403,9 +1403,12 @@ pub fn test_f_get_set_xattr( let cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x02); - assert_eq!(cqes[0].result(), attr_value.as_bytes().len() as i32); + assert_eq!( + cqes[0].result().unwrap(), + attr_value.as_bytes().len() as u32 + ); - let retrieved_value = CString::new(&buffer[..cqes[0].result() as usize])?; + let retrieved_value = CString::new(&buffer[..cqes[0].result().unwrap() as usize])?; assert_eq!(retrieved_value, attr_value); Ok(()) diff --git a/io-uring-test/src/tests/futex.rs b/io-uring-test/src/tests/futex.rs index d0253914..90a8a53c 100644 --- a/io-uring-test/src/tests/futex.rs +++ b/io-uring-test/src/tests/futex.rs @@ -77,7 +77,7 @@ pub fn test_futex_wait( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), USER_DATA); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); Ok(()) } @@ -129,7 +129,7 @@ pub fn test_futex_wake( let cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), USER_DATA); - assert_eq!(cqes[0].result(), 1); + assert_eq!(cqes[0].result().unwrap(), 1); wait_thread.join().unwrap(); @@ -181,7 +181,7 @@ pub fn test_futex_waitv( let cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), USER_DATA); - assert_eq!(cqes[0].result(), TRIGGER_IDX as _); + assert_eq!(cqes[0].result().unwrap(), TRIGGER_IDX as _); Ok(()) } diff --git a/io-uring-test/src/tests/net.rs b/io-uring-test/src/tests/net.rs index cb61c449..768cfcbd 100644 --- a/io-uring-test/src/tests/net.rs +++ b/io-uring-test/src/tests/net.rs @@ -111,10 +111,10 @@ pub fn test_tcp_send_recv( assert_eq!(cqes.len(), 2); assert_eq!(cqes[0].user_data(), 0x01); assert_eq!(cqes[1].user_data(), 0x02); - assert_eq!(cqes[0].result(), text.len() as i32); - assert_eq!(cqes[1].result(), text.len() as i32); + assert_eq!(cqes[0].result().unwrap(), text.len() as u32); + assert_eq!(cqes[1].result().unwrap(), text.len() as u32); - assert_eq!(&output[..cqes[1].result() as usize], text); + assert_eq!(&output[..cqes[1].result().unwrap() as usize], text); Ok(()) } @@ -169,7 +169,7 @@ pub fn test_tcp_send_bundle( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x01); - assert_eq!(cqes[0].result(), text.len() as i32); + assert_eq!(cqes[0].result().unwrap(), text.len() as u32); assert_eq!( recv_stream @@ -227,19 +227,19 @@ pub fn test_tcp_zero_copy_send_recv { assert!(!io_uring::cqueue::more(cqes[1].flags())); - assert_eq!(cqes[2].result(), text.len() as i32); - assert_eq!(&output[..cqes[2].result() as usize], text); + assert_eq!(cqes[2].result().unwrap(), text.len() as u32); + assert_eq!(&output[..cqes[2].result().unwrap() as usize], text); } (0x02, 0x01) => { assert!(!io_uring::cqueue::more(cqes[2].flags())); - assert_eq!(cqes[1].result(), text.len() as i32); - assert_eq!(&output[..cqes[1].result() as usize], text); + assert_eq!(cqes[1].result().unwrap(), text.len() as u32); + assert_eq!(&output[..cqes[1].result().unwrap() as usize], text); } _ => unreachable!(), } @@ -310,19 +310,19 @@ pub fn test_tcp_zero_copy_send_fixed { assert!(!io_uring::cqueue::more(cqes[1].flags())); - assert_eq!(cqes[2].result(), text.len() as i32); - assert_eq!(&output[..cqes[2].result() as usize], text); + assert_eq!(cqes[2].result().unwrap(), text.len() as u32); + assert_eq!(&output[..cqes[2].result().unwrap() as usize], text); } (0x02, 0x01) => { assert!(!io_uring::cqueue::more(cqes[2].flags())); - assert_eq!(cqes[1].result(), text.len() as i32); - assert_eq!(&output[..cqes[1].result() as usize], text); + assert_eq!(cqes[1].result().unwrap(), text.len() as u32); + assert_eq!(&output[..cqes[1].result().unwrap() as usize], text); } _ => unreachable!(), } @@ -409,8 +409,8 @@ pub fn test_tcp_sendmsg_recvmsg( assert_eq!(cqes.len(), 2); assert_eq!(cqes[0].user_data(), 0x01); assert_eq!(cqes[1].user_data(), 0x02); - assert_eq!(cqes[0].result(), text.len() as i32); - assert_eq!(cqes[1].result(), text.len() as i32); + assert_eq!(cqes[0].result().unwrap(), text.len() as u32); + assert_eq!(cqes[1].result().unwrap(), text.len() as u32); assert_eq!(buf2, text); @@ -496,19 +496,19 @@ pub fn test_tcp_zero_copy_sendmsg_recvmsg { assert!(!io_uring::cqueue::more(cqes[1].flags())); - assert_eq!(cqes[2].result(), text.len() as i32); - assert_eq!(&buf2[..cqes[2].result() as usize], text); + assert_eq!(cqes[2].result().unwrap(), text.len() as u32); + assert_eq!(&buf2[..cqes[2].result().unwrap() as usize], text); } (0x02, 0x01) => { assert!(!io_uring::cqueue::more(cqes[2].flags())); - assert_eq!(cqes[1].result(), text.len() as i32); - assert_eq!(&buf2[..cqes[1].result() as usize], text); + assert_eq!(cqes[1].result().unwrap(), text.len() as u32); + assert_eq!(&buf2[..cqes[1].result().unwrap() as usize], text); } _ => unreachable!(), } @@ -549,12 +549,11 @@ pub fn test_tcp_accept( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x0e); - assert!(cqes[0].result() >= 0); - let fd = cqes[0].result(); + let fd = cqes[0].result().unwrap(); unsafe { - libc::close(fd); + libc::close(fd as i32); } Ok(()) @@ -603,7 +602,7 @@ pub fn test_tcp_accept_file_index @@ -653,12 +652,11 @@ pub fn test_tcp_accept_multi( for cqe in cqes { assert_eq!(cqe.user_data(), 2002); - assert!(cqe.result() >= 0); - let fd = cqe.result(); + let fd = cqe.result().unwrap(); unsafe { - libc::close(fd); + libc::close(fd as i32); } } @@ -687,8 +685,11 @@ pub fn test_tcp_accept_multi( assert_eq!(cqes[op1].user_data(), 2002); assert_eq!(cqes[op2].user_data(), 2003); - assert_eq!(cqes[op1].result(), -libc::ECANCELED); - assert_eq!(cqes[op2].result(), 0); + assert_eq!( + cqes[op1].result().unwrap_err().raw_os_error().unwrap(), + libc::ECANCELED + ); + assert_eq!(cqes[op2].result().unwrap(), 0); Ok(()) } @@ -736,7 +737,7 @@ pub fn test_tcp_accept_multi_file_index= 0); + let _ = cqes[round].result().unwrap(); // The fixed descriptor will be closed when the // table is unregistered below. @@ -768,8 +769,11 @@ pub fn test_tcp_accept_multi_file_index( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x0f); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); let _ = listener.accept()?; @@ -858,7 +862,7 @@ pub fn test_tcp_buffer_select( let cqe: cqueue::Entry = ring.completion().next().expect("cqueue is empty").into(); assert_eq!(cqe.user_data(), 0x21); - // assert_eq!(cqe.result(), 0xdead); + // assert_eq!(cqe.result().unwrap(), 0xdead); // write 1024 + 256 send_stream.write_all(&input)?; @@ -879,7 +883,7 @@ pub fn test_tcp_buffer_select( let cqe: cqueue::Entry = ring.completion().next().expect("cqueue is empty").into(); assert_eq!(cqe.user_data(), 0x22); - assert_eq!(cqe.result(), 1024); + assert_eq!(cqe.result().unwrap(), 1024); assert_eq!(cqueue::buffer_select(cqe.flags()), Some(0)); assert_eq!(&bufs[..1024], &input[..1024]); @@ -899,7 +903,10 @@ pub fn test_tcp_buffer_select( let cqe: cqueue::Entry = ring.completion().next().expect("cqueue is empty").into(); assert_eq!(cqe.user_data(), 0x23); - assert_eq!(cqe.result(), -libc::ENOBUFS); + assert_eq!( + cqe.result().unwrap_err().raw_os_error().unwrap(), + libc::ENOBUFS + ); // provides two bufs, one of which we will use, one we will free let mut bufs = vec![0; 2 * 1024]; @@ -916,7 +923,7 @@ pub fn test_tcp_buffer_select( let cqe: cqueue::Entry = ring.completion().next().expect("cqueue is empty").into(); assert_eq!(cqe.user_data(), 0x24); - // assert_eq!(cqe.result(), 0xdeae); + // assert_eq!(cqe.result().unwrap(), 0xdeae); // recv 2 let recv_e = opcode::Recv::new(recv_fd, std::ptr::null_mut(), 1024) @@ -934,7 +941,7 @@ pub fn test_tcp_buffer_select( let cqe: cqueue::Entry = ring.completion().next().expect("cqueue is empty").into(); assert_eq!(cqe.user_data(), 0x25); - assert_eq!(cqe.result(), 256); + assert_eq!(cqe.result().unwrap(), 256); let (buf0, buf1) = bufs.split_at(1024); let bid = cqueue::buffer_select(cqe.flags()).expect("no buffer id"); @@ -957,7 +964,7 @@ pub fn test_tcp_buffer_select( let cqe: cqueue::Entry = ring.completion().next().expect("cqueue is empty").into(); assert_eq!(cqe.user_data(), 0x26); - assert_eq!(cqe.result(), 1); + assert_eq!(cqe.result().unwrap(), 1); // remove bufs fail let remove_bufs_e = opcode::RemoveBuffers::new(1, 0xdeaf); @@ -972,7 +979,10 @@ pub fn test_tcp_buffer_select( let cqe: cqueue::Entry = ring.completion().next().expect("cqueue is empty").into(); assert_eq!(cqe.user_data(), 0x27); - assert_eq!(cqe.result(), -libc::ENOENT); + assert_eq!( + cqe.result().unwrap_err().raw_os_error().unwrap(), + libc::ENOENT + ); Ok(()) } @@ -1044,7 +1054,7 @@ pub fn test_tcp_buffer_select_recvmsg( let cqe: cqueue::Entry = ring.completion().next().expect("cqueue is empty").into(); assert_eq!(cqe.user_data(), 0x21); - assert_eq!(cqe.result(), 0); + assert_eq!(cqe.result().unwrap(), 0); // write all 1024 + 256 send_stream.write_all(&input)?; @@ -1204,20 +1214,23 @@ pub fn test_tcp_recv_multi( assert_eq!(cqes.len(), 3); assert_eq!(cqes[0].user_data(), 0x22); - assert_eq!(cqes[0].result(), 1024); // length 1024 + assert_eq!(cqes[0].result().unwrap(), 1024); // length 1024 assert!(cqueue::more(cqes[0].flags())); assert_eq!(cqueue::buffer_select(cqes[0].flags()), Some(0)); assert_eq!(&bufs[..1024], &input[..1024]); assert_eq!(cqes[1].user_data(), 0x22); - assert_eq!(cqes[1].result(), 256); // length 256 + assert_eq!(cqes[1].result().unwrap(), 256); // length 256 assert!(cqueue::more(cqes[1].flags())); assert_eq!(cqueue::buffer_select(cqes[1].flags()), Some(1)); assert_eq!(&bufs[1024..][..256], &input[1024..][..256]); assert_eq!(cqes[2].user_data(), 0x22); assert!(!cqueue::more(cqes[2].flags())); - assert_eq!(cqes[2].result(), -libc::ENOBUFS); + assert_eq!( + cqes[2].result().unwrap_err().raw_os_error().unwrap(), + libc::ENOBUFS + ); Ok(()) } @@ -1276,7 +1289,7 @@ pub fn test_tcp_recv_bundle( assert_eq!(cqe.user_data(), 0x30); assert!(cqueue::buffer_select(cqe.flags()).is_some()); - let mut remaining = cqe.result() as usize; + let mut remaining = cqe.result().unwrap() as usize; let bufs = buf_ring .rc .get_bufs(&buf_ring, remaining as u32, cqe.flags()); @@ -1347,10 +1360,9 @@ pub fn test_tcp_recv_multi_bundle= 0); assert_eq!(cqe.user_data(), 0x31); assert!(cqueue::buffer_select(cqe.flags()).is_some()); - let mut remaining = cqe.result() as usize; + let mut remaining = cqe.result().unwrap() as usize; let bufs = buf_ring .rc .get_bufs(&buf_ring, remaining as u32, cqe.flags()); @@ -1376,10 +1388,9 @@ pub fn test_tcp_recv_multi_bundle= 0); assert_eq!(cqe.user_data(), 0x31); assert!(cqueue::buffer_select(cqe.flags()).is_some()); - remaining = cqe.result() as usize; + remaining = cqe.result().unwrap() as usize; let second_bufs = buf_ring .rc .get_bufs(&buf_ring, remaining as u32, cqe.flags()); @@ -1399,8 +1410,14 @@ pub fn test_tcp_recv_multi_bundle= 5 || cqe.result() != 0 { - assert_eq!(cqe.result(), -libc::ENOBUFS); + match cqe.result() { + Ok(res) => { + assert_eq!(res, 0); + assert!(used_bufs < 5); + } + Err(e) => { + assert_eq!(e.raw_os_error().unwrap(), libc::ENOBUFS); + } } } buf_ring.rc.unregister(ring)?; @@ -1439,7 +1456,7 @@ pub fn test_tcp_shutdown( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x28); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); let text = b"C'est la vie"; let write_e = opcode::Write::new(sock_fd, text.as_ptr(), text.len() as _); @@ -1455,7 +1472,7 @@ pub fn test_tcp_shutdown( let cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); - assert_eq!(cqes[0].result(), -32); // EPIPE + assert_eq!(cqes[0].result().unwrap_err().raw_os_error().unwrap(), 32); // EPIPE Ok(()) } @@ -1493,8 +1510,8 @@ pub fn test_socket( let cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 42); - assert!(cqes[0].result() >= 0); - let io_uring_socket = unsafe { Socket::from_raw_fd(cqes[0].result()) }; + let fd = cqes[0].result().unwrap(); + let io_uring_socket = unsafe { Socket::from_raw_fd(fd as i32) }; assert!(io_uring_socket.as_raw_fd() != plain_fd); assert_eq!(cqes[0].flags(), 0); @@ -1533,7 +1550,7 @@ pub fn test_socket( let cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 1234); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); assert_eq!(cqes[0].flags(), 0); // Check value actually set. @@ -1581,7 +1598,7 @@ pub fn test_socket( let cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 55); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); assert_eq!(cqes[0].flags(), 0); // If the fixed-socket operation worked properly, this must not fail. @@ -1625,8 +1642,8 @@ pub fn test_socket_bind_listen( let cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 42); - assert!(cqes[0].result() >= 0); - let io_uring_socket = unsafe { Socket::from_raw_fd(cqes[0].result()) }; + let fd = cqes[0].result().unwrap(); + let io_uring_socket = unsafe { Socket::from_raw_fd(fd as i32) }; assert!(io_uring_socket.as_raw_fd() != plain_fd); assert_eq!(cqes[0].flags(), 0); @@ -1648,7 +1665,7 @@ pub fn test_socket_bind_listen( let cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 2345); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); assert_eq!(cqes[0].flags(), 0); assert_eq!( @@ -1675,7 +1692,7 @@ pub fn test_socket_bind_listen( let cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 3456); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); assert_eq!(cqes[0].flags(), 0); // Ensure the socket is actually in the listening state. @@ -1718,7 +1735,7 @@ pub fn test_socket_bind_listen( let cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 55); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); assert_eq!(cqes[0].flags(), 0); // If the fixed-socket operation worked properly, this must not fail. @@ -1767,7 +1784,7 @@ pub fn test_udp_recvmsg_multishot = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 11); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); assert_eq!(cqes[0].flags(), 0); } @@ -1836,12 +1853,12 @@ pub fn test_udp_recvmsg_multishot { - assert!(cqe.result() > 0); + assert!(cqe.result().unwrap() > 0); assert!(!is_more); } // SendMsgZc with two notification 66 => { - if cqe.result() > 0 { + if cqe.result().unwrap() > 0 { assert!(is_more); } else { assert!(!is_more); @@ -1849,7 +1866,7 @@ pub fn test_udp_recvmsg_multishot { - assert!(cqe.result() > 0, "{:?}", cqe.result()); + assert!(cqe.result().unwrap() > 0, "{:?}", cqe.result()); let buf_id = io_uring::cqueue::buffer_select(cqe.flags()).unwrap(); let tmp_buf = &buffers[buf_id as usize]; let msg = types::RecvMsgOut::parse(tmp_buf, &msghdr).unwrap(); @@ -1873,7 +1890,7 @@ pub fn test_udp_recvmsg_multishot { - assert_eq!(cqe.result(), -105); + assert_eq!(cqe.result().unwrap_err().raw_os_error().unwrap(), 105); } _ => { unreachable!() @@ -1921,7 +1938,7 @@ pub fn test_udp_recvmsg_multishot_trunc = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 11); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); assert_eq!(cqes[0].flags(), 0); } @@ -1972,17 +1989,18 @@ pub fn test_udp_recvmsg_multishot_trunc { - assert!(cqe.result() > 0); + assert!(cqe.result().unwrap() > 0); assert!(!is_more); } // RecvMsgMulti 77 => { - if cqe.result() == -libc::ENOBUFS { + match cqe.result() { // Ran out of buffers - continue; + Err(e) if e.raw_os_error() == Some(libc::ENOBUFS) => continue, + _ => (), } - assert!(cqe.result() > 0); + assert!(cqe.result().unwrap() > 0); assert!(is_more); let buf_id = cqueue::buffer_select(cqe.flags()).unwrap() % buffers.len() as u16; let tmp_buf = &buffers[buf_id as usize]; @@ -2073,18 +2091,21 @@ pub fn test_udp_send_with_dest( match cqe.user_data() { 1 => { // The receive, we should have received the test message here. - let n_received = cqe.result(); - assert_eq!(n_received, out_buf.len() as i32); + let n_received = cqe.result().unwrap(); + assert_eq!(n_received, out_buf.len() as u32); assert_eq!(&in_buf[..n_received as usize], out_buf); } 2 => { // The send should have failed because it had no destination address. - assert_eq!(cqe.result(), -libc::EDESTADDRREQ); + assert_eq!( + cqe.result().unwrap_err().raw_os_error().unwrap(), + libc::EDESTADDRREQ + ); } 3 => { // The send that should have succeeded. - let n_sent = cqe.result(); - assert_eq!(n_sent, out_buf.len() as i32); + let n_sent = cqe.result().unwrap(); + assert_eq!(n_sent, out_buf.len() as u32); } _ => unreachable!("We only submit user data 1, 2, and 3."), } @@ -2132,7 +2153,7 @@ pub fn test_udp_sendzc_with_dest let cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 11); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); assert_eq!(cqes[0].flags(), 0); } @@ -2173,10 +2194,10 @@ pub fn test_udp_sendzc_with_dest // data finally arrived to server 3 => { let buf_index_1 = cqueue::buffer_select(cqe.flags()).unwrap(); - assert_eq!(cqe.result(), 11); + assert_eq!(cqe.result().unwrap(), 11); assert_eq!(&buffers[buf_index_1 as usize][..11], buf1); } - 33 => match cqe.result() { + 33 => match cqe.result().unwrap() { // First SendZc notification 11 => { assert!(cqueue::more(cqe.flags())); @@ -2422,10 +2443,9 @@ pub fn test_tcp_recvzc(test: &Test) -> anyhow::Result<() assert_eq!(cqe.user_data(), REQ_TYPE_ACCEPT); { - assert!(cqe.result() >= 0); - let fd = cqe.result(); + let fd = cqe.result().unwrap(); let mut squeue = unsafe { ring.submission_shared() }; - let sqe = opcode::RecvZc::new(types::Fd(fd), STREAM_SIZE) + let sqe = opcode::RecvZc::new(types::Fd(fd as i32), STREAM_SIZE) .ifq(reg.zcrx_id) .build() .user_data(REQ_TYPE_RX) @@ -2444,8 +2464,7 @@ pub fn test_tcp_recvzc(test: &Test) -> anyhow::Result<() // Process the RecvZc cqe. let cqe = unsafe { ring.completion_shared() }.next().unwrap(); assert_eq!(cqe.user_data(), REQ_TYPE_RX); - assert!(cqe.result() >= 0); - let len = cqe.result().cast_unsigned(); + let len = cqe.result().unwrap(); received += len; diff --git a/io-uring-test/src/tests/os.rs b/io-uring-test/src/tests/os.rs index a8068a1a..4e6d6fc5 100644 --- a/io-uring-test/src/tests/os.rs +++ b/io-uring-test/src/tests/os.rs @@ -40,7 +40,7 @@ pub fn test_waitid( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x110); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); Ok(()) } diff --git a/io-uring-test/src/tests/pipe.rs b/io-uring-test/src/tests/pipe.rs index 7d65c60b..3b55d423 100644 --- a/io-uring-test/src/tests/pipe.rs +++ b/io-uring-test/src/tests/pipe.rs @@ -36,7 +36,7 @@ pub fn test_pipe( .map(Into::::into) .next() .unwrap(); - assert!(cqe.result() >= 0); + let _ = cqe.result().unwrap(); assert_eq!(cqe.user_data(), REQ_TYPE_PIPE); // Ensure the fds were assigned. diff --git a/io-uring-test/src/tests/poll.rs b/io-uring-test/src/tests/poll.rs index 835dd3a3..22419e87 100644 --- a/io-uring-test/src/tests/poll.rs +++ b/io-uring-test/src/tests/poll.rs @@ -47,7 +47,7 @@ pub fn test_eventfd_poll( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x04); - assert_eq!(cqes[0].result(), 1); + assert_eq!(cqes[0].result().unwrap(), 1); Ok(()) } @@ -111,8 +111,11 @@ pub fn test_eventfd_poll_remove( assert_eq!(cqes.len(), 2); assert_eq!(cqes[0].user_data(), 0x05); assert_eq!(cqes[1].user_data(), 0x06); - assert_eq!(cqes[0].result(), -libc::ECANCELED); - assert_eq!(cqes[1].result(), 0); + assert_eq!( + cqes[0].result().unwrap_err().raw_os_error().unwrap(), + libc::ECANCELED + ); + assert_eq!(cqes[1].result().unwrap(), 0); Ok(()) } @@ -173,8 +176,11 @@ pub fn test_eventfd_poll_remove_failed( assert_eq!(cqes[0].user_data(), 0x04); assert!(io_uring::cqueue::more(cqes[0].flags())); - assert_eq!(cqes[0].result(), 1); + assert_eq!(cqes[0].result().unwrap(), 1); assert_eq!(cqes[1].user_data(), 0x04); assert!(io_uring::cqueue::more(cqes[1].flags())); - assert_eq!(cqes[1].result(), 1); + assert_eq!(cqes[1].result().unwrap(), 1); Ok(()) } diff --git a/io-uring-test/src/tests/queue.rs b/io-uring-test/src/tests/queue.rs index 68dddad3..68e09d5b 100644 --- a/io-uring-test/src/tests/queue.rs +++ b/io-uring-test/src/tests/queue.rs @@ -24,7 +24,7 @@ pub fn test_nop( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x42); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); Ok(()) } @@ -145,7 +145,7 @@ pub fn test_debug_print( assert_eq!(cqes.len(), num_to_sub); for cqe in cqes { assert_eq!(cqe.user_data(), 0x42); - assert_eq!(cqe.result(), 0); + assert_eq!(cqe.result().unwrap(), 0); } println!("Empty: {:?}", ring.submission()); @@ -186,13 +186,13 @@ pub fn test_msg_ring_data( let source_cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(source_cqes.len(), 1); assert_eq!(source_cqes[0].user_data(), 0); - assert_eq!(source_cqes[0].result(), 0); + assert_eq!(source_cqes[0].result().unwrap(), 0); assert_eq!(source_cqes[0].flags(), 0); let dest_cqes: Vec = dest_ring.completion().map(Into::into).collect(); assert_eq!(dest_cqes.len(), 1); assert_eq!(dest_cqes[0].user_data(), user_data); - assert_eq!(dest_cqes[0].result(), result); + assert_eq!(dest_cqes[0].result().unwrap(), result as u32); assert_eq!(dest_cqes[0].flags(), 0); Ok(()) @@ -253,13 +253,13 @@ pub fn test_msg_ring_send_fd( let source_cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(source_cqes.len(), 1); assert_eq!(source_cqes[0].user_data(), 0); - assert_eq!(source_cqes[0].result(), 0); + assert_eq!(source_cqes[0].result().unwrap(), 0); assert_eq!(source_cqes[0].flags(), 0); let dest_cqes: Vec = temp_ring.completion().map(Into::into).collect(); assert_eq!(dest_cqes.len(), 1); assert_eq!(dest_cqes[0].user_data(), 22); - assert_eq!(dest_cqes[0].result(), 0); + assert_eq!(dest_cqes[0].result().unwrap(), 0); assert_eq!(dest_cqes[0].flags(), 0); } @@ -284,13 +284,13 @@ pub fn test_msg_ring_send_fd( let source_cqes: Vec = temp_ring.completion().map(Into::into).collect(); assert_eq!(source_cqes.len(), 1); assert_eq!(source_cqes[0].user_data(), 0); - assert_eq!(source_cqes[0].result(), 0); + assert_eq!(source_cqes[0].result().unwrap(), 0); assert_eq!(source_cqes[0].flags(), 0); let dest_cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(dest_cqes.len(), 1); assert_eq!(dest_cqes[0].user_data(), 44); - assert_eq!(dest_cqes[0].result(), 0); + assert_eq!(dest_cqes[0].result().unwrap(), 0); assert_eq!(dest_cqes[0].flags(), 0); } diff --git a/io-uring-test/src/tests/register_buf_ring.rs b/io-uring-test/src/tests/register_buf_ring.rs index e336bb46..c39a5988 100644 --- a/io-uring-test/src/tests/register_buf_ring.rs +++ b/io-uring-test/src/tests/register_buf_ring.rs @@ -573,7 +573,7 @@ where let cqes: Vec = ring.completion().map(Into::into).collect(); assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x01); - assert_eq!(cqes[0].result(), text.len() as i32); + assert_eq!(cqes[0].result().unwrap(), text.len() as u32); Ok(()) } @@ -611,13 +611,9 @@ where assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x02); - let result = cqes[0].result(); - if result < 0 { - // Expect ENOBUFS when the buf_ring is empty. - return Err(io::Error::from_raw_os_error(-result)); - } + // Expect ENOBUFS when the buf_ring is empty. + let result = cqes[0].result()?; - let result = result as u32; assert_eq!(result, len); let flags = cqes[0].flags(); let buf = buf_ring.rc.get_buf(buf_ring.clone(), result, flags)?; diff --git a/io-uring-test/src/tests/register_buffers.rs b/io-uring-test/src/tests/register_buffers.rs index feeb3a8b..0547fe81 100644 --- a/io-uring-test/src/tests/register_buffers.rs +++ b/io-uring-test/src/tests/register_buffers.rs @@ -133,8 +133,8 @@ fn _test_register_buffers< cqes.iter().enumerate().for_each(|(index, ce)| { assert!(ce.user_data() < BUFFERS as u64); assert_eq!( - ce.result(), - BUF_SIZE as i32, + ce.result().unwrap(), + BUF_SIZE as u32, "WriteFixed operation {} failed", index ); @@ -171,8 +171,8 @@ fn _test_register_buffers< cqes.iter().enumerate().for_each(|(index, ce)| { assert!(ce.user_data() < BUFFERS as u64); assert_eq!( - ce.result(), - BUF_SIZE as i32, + ce.result().unwrap(), + BUF_SIZE as u32, "ReadFixed operation {} failed", index ); @@ -255,8 +255,9 @@ pub fn test_register_buffers_update (), + x => anyhow::bail!("unexpected read result: {x:?}"), } // Register a buffer at the index 5 @@ -309,8 +310,8 @@ pub fn test_register_buffers_update let completions = wait_get_completions(ring, 1).unwrap(); assert_eq!(completions.len(), 1); assert_eq!(completions[0].user_data(), USER_DATA_0); - assert_eq!(completions[0].result(), -libc::ECANCELED); + assert_eq!( + completions[0].result().unwrap_err().raw_os_error().unwrap(), + libc::ECANCELED + ); // Cancel the second and third operation by user_data. ring.submitter() @@ -85,7 +88,10 @@ pub fn test_register_sync_cancel assert_eq!(completions.len(), 2); for completion in completions { assert_eq!(completion.user_data(), USER_DATA_1); - assert_eq!(completion.result(), -libc::ECANCELED); + assert_eq!( + completion.result().unwrap_err().raw_os_error().unwrap(), + libc::ECANCELED + ); } // Cancel the fourth and fifth operation by fd. @@ -95,7 +101,10 @@ pub fn test_register_sync_cancel assert_eq!(completions.len(), 2); for completion in completions { assert_eq!(completion.user_data(), USER_DATA_2); - assert_eq!(completion.result(), -libc::ECANCELED); + assert_eq!( + completion.result().unwrap_err().raw_os_error().unwrap(), + libc::ECANCELED + ); } // Cancel one of the fixed_fd operations by the fixed_fd. @@ -104,7 +113,10 @@ pub fn test_register_sync_cancel let completions = wait_get_completions(ring, 1).unwrap(); assert_eq!(completions.len(), 1); assert_eq!(completions[0].user_data(), USER_DATA_3); - assert_eq!(completions[0].result(), -libc::ECANCELED); + assert_eq!( + completions[0].result().unwrap_err().raw_os_error().unwrap(), + libc::ECANCELED + ); // Cancel the two remaining fixed_fd operations by the fixed_fd. ring.submitter() @@ -112,7 +124,10 @@ pub fn test_register_sync_cancel let completions = wait_get_completions(ring, 2).unwrap(); for completion in completions { assert_eq!(completion.user_data(), USER_DATA_3); - assert_eq!(completion.result(), -libc::ECANCELED); + assert_eq!( + completion.result().unwrap_err().raw_os_error().unwrap(), + libc::ECANCELED + ); } // Cancel all of the remaining requests, should be 3 outstanding. @@ -122,7 +137,10 @@ pub fn test_register_sync_cancel assert_eq!(completions.len(), 3); for completion in completions { assert_eq!(completion.user_data(), USER_DATA_4); - assert_eq!(completion.result(), -libc::ECANCELED); + assert_eq!( + completion.result().unwrap_err().raw_os_error().unwrap(), + libc::ECANCELED + ); } ring.submitter().unregister_files()?; @@ -163,7 +181,10 @@ pub fn test_register_sync_cancel_any( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x09); - assert_eq!(cqes[0].result(), -libc::ETIME); + assert_eq!( + cqes[0].result().unwrap_err().raw_os_error().unwrap(), + libc::ETIME + ); // add timeout but no @@ -63,7 +66,7 @@ pub fn test_timeout( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x0b); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); // timeout @@ -75,7 +78,10 @@ pub fn test_timeout( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x0a); - assert_eq!(cqes[0].result(), -libc::ETIME); + assert_eq!( + cqes[0].result().unwrap_err().raw_os_error().unwrap(), + libc::ETIME + ); Ok(()) } @@ -116,8 +122,8 @@ pub fn test_timeout_count( assert_eq!(cqes.len(), 2); assert_eq!(cqes[0].user_data(), 0x0c); assert_eq!(cqes[1].user_data(), 0x0d); - assert_eq!(cqes[0].result(), 0); - assert_eq!(cqes[1].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); + assert_eq!(cqes[1].result().unwrap(), 0); Ok(()) } @@ -170,8 +176,11 @@ pub fn test_timeout_remove( assert_eq!(cqes.len(), 2); assert_eq!(cqes[0].user_data(), 0x10); assert_eq!(cqes[1].user_data(), 0x11); - assert_eq!(cqes[0].result(), -libc::ECANCELED); - assert_eq!(cqes[1].result(), 0); + assert_eq!( + cqes[0].result().unwrap_err().raw_os_error().unwrap(), + libc::ECANCELED + ); + assert_eq!(cqes[1].result().unwrap(), 0); Ok(()) } @@ -226,8 +235,11 @@ pub fn test_timeout_update( assert_eq!(cqes.len(), 2); assert_eq!(cqes[0].user_data(), 0x10); assert_eq!(cqes[1].user_data(), 0x11); - assert_eq!(cqes[0].result(), -libc::ETIME); - assert_eq!(cqes[1].result(), 0); + assert_eq!( + cqes[0].result().unwrap_err().raw_os_error().unwrap(), + libc::ETIME + ); + assert_eq!(cqes[1].result().unwrap(), 0); Ok(()) } @@ -280,8 +292,11 @@ pub fn test_timeout_cancel( assert_eq!(cqes.len(), 2); assert_eq!(cqes[0].user_data(), 0x10); assert_eq!(cqes[1].user_data(), 0x11); - assert_eq!(cqes[0].result(), -libc::ECANCELED); - assert_eq!(cqes[1].result(), 0); + assert_eq!( + cqes[0].result().unwrap_err().raw_os_error().unwrap(), + libc::ECANCELED + ); + assert_eq!(cqes[1].result().unwrap(), 0); Ok(()) } @@ -328,7 +343,10 @@ pub fn test_timeout_abs( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x19); - assert_eq!(cqes[0].result(), -libc::ETIME); + assert_eq!( + cqes[0].result().unwrap_err().raw_os_error().unwrap(), + libc::ETIME + ); Ok(()) } @@ -377,7 +395,7 @@ pub fn test_timeout_submit_args( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x1c); - assert_eq!(cqes[0].result(), 0); + assert_eq!(cqes[0].result().unwrap(), 0); Ok(()) } @@ -429,7 +447,7 @@ pub fn test_timeout_submit_args_min_wait( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x0c); - assert_eq!(cqes[0].result(), -libc::ETIME); + assert_eq!( + cqes[0].result().unwrap_err().raw_os_error().unwrap(), + libc::ETIME + ); assert!(cqueue::more(cqes[0].flags())); ring.submit_and_wait(1)?; @@ -479,7 +500,10 @@ pub fn test_timeout_multishot( assert_eq!(cqes.len(), 1); assert_eq!(cqes[0].user_data(), 0x0c); - assert_eq!(cqes[0].result(), -libc::ETIME); + assert_eq!( + cqes[0].result().unwrap_err().raw_os_error().unwrap(), + libc::ETIME + ); assert!(!cqueue::more(cqes[0].flags())); Ok(()) diff --git a/io-uring-test/src/utils.rs b/io-uring-test/src/utils.rs index 9ac51e26..f8b07410 100644 --- a/io-uring-test/src/utils.rs +++ b/io-uring-test/src/utils.rs @@ -84,10 +84,10 @@ pub fn write_read( assert_eq!(cqes.len(), 2); assert_eq!(cqes[0].user_data(), 0x01); assert_eq!(cqes[1].user_data(), 0x02); - assert_eq!(cqes[0].result(), text.len() as i32); - assert_eq!(cqes[1].result(), text.len() as i32); + assert_eq!(cqes[0].result().unwrap(), text.len() as u32); + assert_eq!(cqes[1].result().unwrap(), text.len() as u32); - assert_eq!(&output[..cqes[1].result() as usize], text); + assert_eq!(&output[..cqes[1].result().unwrap() as usize], text); Ok(()) } @@ -128,8 +128,8 @@ pub fn writev_readv( assert_eq!(cqes.len(), 2); assert_eq!(cqes[0].user_data(), 0x01); assert_eq!(cqes[1].user_data(), 0x02); - assert_eq!(cqes[0].result(), (text.len() + text2.len()) as i32); - assert_eq!(cqes[1].result(), (text.len() + text2.len()) as i32); + assert_eq!(cqes[0].result().unwrap(), (text.len() + text2.len()) as u32); + assert_eq!(cqes[1].result().unwrap(), (text.len() + text2.len()) as u32); assert_eq!(&output, text); assert_eq!(&output2[..], text2);