Skip to content

Commit ac3b8a6

Browse files
committed
Change read and write to return the number of bytes read/written.
1 parent 5a28fe6 commit ac3b8a6

File tree

2 files changed

+18
-16
lines changed

2 files changed

+18
-16
lines changed

drivers/char/rust_example.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,10 @@ impl FileOperations for Token {
9999

100100
kernel::declare_file_operations!(read, write);
101101

102-
fn read(&self, _file: &File, data: &mut UserSlicePtrWriter, offset: u64) -> KernelResult {
102+
fn read(&self, _: &File, data: &mut UserSlicePtrWriter, offset: u64) -> KernelResult<usize> {
103103
// Succeed if the caller doesn't provide a buffer or if not at the start.
104104
if data.is_empty() || offset != 0 {
105-
return Ok(());
105+
return Ok(0);
106106
}
107107

108108
{
@@ -124,10 +124,10 @@ impl FileOperations for Token {
124124

125125
// Write a one-byte 1 to the reader.
126126
data.write_slice(&[1u8; 1])?;
127-
Ok(())
127+
Ok(1)
128128
}
129129

130-
fn write(&self, data: &mut UserSlicePtrReader, _offset: u64) -> KernelResult<isize> {
130+
fn write(&self, data: &mut UserSlicePtrReader, _offset: u64) -> KernelResult<usize> {
131131
{
132132
let mut inner = self.shared.inner.lock();
133133

@@ -144,8 +144,7 @@ impl FileOperations for Token {
144144

145145
// Notify a possible reader waiting.
146146
self.shared.state_changed.notify_all();
147-
data.read_all()?;
148-
Ok(0)
147+
Ok(data.len())
149148
}
150149
}
151150

rust/kernel/file_operations.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,9 @@ unsafe extern "C" fn read_callback<T: FileOperations>(
105105
let f = &*((*file).private_data as *const T);
106106
// No `FMODE_UNSIGNED_OFFSET` support, so `offset` must be in [0, 2^63).
107107
// See discussion in https://github.com/fishinabarrel/linux-kernel-module-rust/pull/113
108-
T::read(f, &File::from_ptr(file), &mut data, (*offset).try_into()?)?;
109-
let written = len - data.len();
110-
(*offset) += bindings::loff_t::try_from(written).unwrap();
111-
Ok(written.try_into().unwrap())
108+
let read = f.read(&File::from_ptr(file), &mut data, (*offset).try_into()?)?;
109+
(*offset) += bindings::loff_t::try_from(read).unwrap();
110+
Ok(read as _)
112111
}
113112
}
114113

@@ -123,10 +122,9 @@ unsafe extern "C" fn write_callback<T: FileOperations>(
123122
let f = &*((*file).private_data as *const T);
124123
// No `FMODE_UNSIGNED_OFFSET` support, so `offset` must be in [0, 2^63).
125124
// See discussion in https://github.com/fishinabarrel/linux-kernel-module-rust/pull/113
126-
T::write(f, &mut data, (*offset).try_into()?)?;
127-
let read = len - data.len();
128-
(*offset) += bindings::loff_t::try_from(read).unwrap();
129-
Ok(read.try_into().unwrap())
125+
let written = f.write(&mut data, (*offset).try_into()?)?;
126+
(*offset) += bindings::loff_t::try_from(written).unwrap();
127+
Ok(written as _)
130128
}
131129
}
132130

@@ -470,14 +468,19 @@ pub trait FileOperations: Send + Sync + Sized {
470468
/// Reads data from this file to userspace.
471469
///
472470
/// Corresponds to the `read` function pointer in `struct file_operations`.
473-
fn read(&self, _file: &File, _data: &mut UserSlicePtrWriter, _offset: u64) -> KernelResult {
471+
fn read(
472+
&self,
473+
_file: &File,
474+
_data: &mut UserSlicePtrWriter,
475+
_offset: u64,
476+
) -> KernelResult<usize> {
474477
Err(Error::EINVAL)
475478
}
476479

477480
/// Writes data from userspace to this file.
478481
///
479482
/// Corresponds to the `write` function pointer in `struct file_operations`.
480-
fn write(&self, _data: &mut UserSlicePtrReader, _offset: u64) -> KernelResult<isize> {
483+
fn write(&self, _data: &mut UserSlicePtrReader, _offset: u64) -> KernelResult<usize> {
481484
Err(Error::EINVAL)
482485
}
483486

0 commit comments

Comments
 (0)