Skip to content

Commit a2801b3

Browse files
committed
Simplifies uio construction
1 parent 5f0bb93 commit a2801b3

File tree

3 files changed

+11
-36
lines changed

3 files changed

+11
-36
lines changed

kernel-1100/src/uio.rs

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,36 +16,20 @@ pub struct Uio {
1616
}
1717

1818
impl okf::uio::Uio<Kernel> for Uio {
19-
unsafe fn new(
20-
td: *mut Thread,
21-
op: UioRw,
22-
seg: UioSeg,
23-
iov: *mut IoVec,
24-
len: usize,
25-
) -> Option<Self> {
26-
// Check vec count.
27-
if len > Self::vec_max() {
28-
return None;
29-
}
30-
31-
// Get total length.
32-
let mut res = 0usize;
33-
34-
for i in 0..len {
35-
res = res.checked_add((*iov.add(i)).len)?;
36-
}
19+
unsafe fn write(td: *mut Thread, iov: *mut IoVec) -> Option<Self> {
20+
let res = (*iov).len;
3721

3822
if res > Self::io_max() {
3923
return None;
4024
}
4125

4226
Some(Self {
4327
iov,
44-
len: len.try_into().unwrap(),
28+
len: 1,
4529
off: -1,
4630
res: res.try_into().unwrap(),
47-
seg,
48-
op,
31+
seg: UioSeg::Kernel,
32+
op: UioRw::Write,
4933
td,
5034
})
5135
}

src/fd/mod.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::pcpu::Pcpu;
22
use crate::thread::Thread;
3-
use crate::uio::{IoVec, Uio, UioRw, UioSeg};
3+
use crate::uio::{IoVec, Uio, UioSeg};
44
use crate::Kernel;
55
use bitflags::bitflags;
66
use core::ffi::{c_char, c_int};
@@ -40,11 +40,10 @@ pub unsafe fn write_all<K: Kernel>(
4040
kern: K,
4141
fd: c_int,
4242
mut data: &[u8],
43-
seg: UioSeg,
4443
td: *mut K::Thread,
4544
) -> Result<(), NonZero<c_int>> {
4645
while !data.is_empty() {
47-
let written = match write(kern, fd, data, seg, td) {
46+
let written = match write(kern, fd, data, td) {
4847
Ok(v) => v,
4948
Err(e) if e == K::EINTR => continue,
5049
Err(e) => return Err(e),
@@ -67,7 +66,6 @@ pub unsafe fn write<K: Kernel>(
6766
kern: K,
6867
fd: c_int,
6968
data: &[u8],
70-
seg: UioSeg,
7169
td: *mut K::Thread,
7270
) -> Result<usize, NonZero<c_int>> {
7371
// Setup iovec.
@@ -77,7 +75,7 @@ pub unsafe fn write<K: Kernel>(
7775
};
7876

7977
// Write.
80-
let mut uio = K::Uio::new(td, UioRw::Write, seg, &mut vec, 1).unwrap();
78+
let mut uio = K::Uio::write(td, &mut vec).unwrap();
8179
let errno = kern.kern_writev(td, fd, &mut uio);
8280

8381
match NonZero::new(errno) {

src/uio/mod.rs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,12 @@ use crate::Kernel;
22

33
/// Represents `uio` structure.
44
pub trait Uio<K: Kernel>: Sized {
5-
/// Returns [`None`] if `len` is geater than [`Uio::vec_max()`] or total length of `iov` is
6-
/// greater than [`Uio::io_max()`].
5+
/// Returns [`None`] if [`IoVec::len`] of `iov` is greater than [`Uio::io_max()`].
76
///
87
/// # Safety
98
/// - `td` cannot be null.
10-
/// - `iov` cannot be null and must be valid up to `len`.
11-
unsafe fn new(
12-
td: *mut K::Thread,
13-
op: UioRw,
14-
seg: UioSeg,
15-
iov: *mut IoVec,
16-
len: usize,
17-
) -> Option<Self>;
9+
/// - `iov` cannot be null.
10+
unsafe fn write(td: *mut K::Thread, iov: *mut IoVec) -> Option<Self>;
1811

1912
/// Returns value of `UIO_MAXIOV`.
2013
fn vec_max() -> usize {

0 commit comments

Comments
 (0)