|
1 | | -use core::convert::TryInto; |
| 1 | +use core::convert::{TryFrom, TryInto}; |
2 | 2 | use core::ops::Range; |
3 | 3 | use core::{mem, ptr}; |
4 | 4 |
|
@@ -139,17 +139,22 @@ unsafe extern "C" fn read_callback<T: FileOperations>( |
139 | 139 | ) -> c_types::c_ssize_t { |
140 | 140 | let mut data = match UserSlicePtr::new(buf as *mut c_types::c_void, len) { |
141 | 141 | Ok(ptr) => ptr.writer(), |
142 | | - Err(e) => return e.to_kernel_errno() as c_types::c_ssize_t, |
| 142 | + Err(e) => return e.to_kernel_errno().try_into().unwrap(), |
143 | 143 | }; |
144 | 144 | let f = &*((*file).private_data as *const T); |
145 | | - // TODO: Pass offset to read()? |
146 | | - match f.read(&mut data) { |
| 145 | + // No FMODE_UNSIGNED_OFFSET support, so offset must be in [0, 2^63). |
| 146 | + // See discussion in #113 |
| 147 | + let positive_offset = match (*offset).try_into() { |
| 148 | + Ok(v) => v, |
| 149 | + Err(_) => return Error::EINVAL.to_kernel_errno().try_into().unwrap(), |
| 150 | + }; |
| 151 | + match f.read(&mut data, positive_offset) { |
147 | 152 | Ok(()) => { |
148 | 153 | let written = len - data.len(); |
149 | | - (*offset) += written as bindings::loff_t; |
150 | | - written as c_types::c_ssize_t |
| 154 | + (*offset) += bindings::loff_t::try_from(written).unwrap(); |
| 155 | + written.try_into().unwrap() |
151 | 156 | } |
152 | | - Err(e) => e.to_kernel_errno() as c_types::c_ssize_t, |
| 157 | + Err(e) => e.to_kernel_errno().try_into().unwrap(), |
153 | 158 | } |
154 | 159 | } |
155 | 160 |
|
@@ -236,7 +241,7 @@ pub trait FileOperations: Sync + Sized { |
236 | 241 | const VTABLE: FileOperationsVtable; |
237 | 242 |
|
238 | 243 | fn open() -> KernelResult<Self>; |
239 | | - fn read(&self, _buf: &mut UserSlicePtrWriter) -> KernelResult<()> { |
| 244 | + fn read(&self, _buf: &mut UserSlicePtrWriter, _offset: u64) -> KernelResult<()> { |
240 | 245 | Err(Error::EINVAL) |
241 | 246 | } |
242 | 247 | fn seek(&self, _file: &File, _offset: SeekFrom) -> KernelResult<u64> { |
|
0 commit comments