@@ -105,10 +105,9 @@ unsafe extern "C" fn read_callback<T: FileOperations>(
105
105
let f = & * ( ( * file) . private_data as * const T ) ;
106
106
// No `FMODE_UNSIGNED_OFFSET` support, so `offset` must be in [0, 2^63).
107
107
// 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 _)
112
111
}
113
112
}
114
113
@@ -123,10 +122,9 @@ unsafe extern "C" fn write_callback<T: FileOperations>(
123
122
let f = & * ( ( * file) . private_data as * const T ) ;
124
123
// No `FMODE_UNSIGNED_OFFSET` support, so `offset` must be in [0, 2^63).
125
124
// 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 _)
130
128
}
131
129
}
132
130
@@ -470,14 +468,19 @@ pub trait FileOperations: Send + Sync + Sized {
470
468
/// Reads data from this file to userspace.
471
469
///
472
470
/// 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 > {
474
477
Err ( Error :: EINVAL )
475
478
}
476
479
477
480
/// Writes data from userspace to this file.
478
481
///
479
482
/// 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 > {
481
484
Err ( Error :: EINVAL )
482
485
}
483
486
0 commit comments