@@ -104,10 +104,9 @@ unsafe extern "C" fn read_callback<T: FileOperations>(
104
104
let f = & * ( ( * file) . private_data as * const T ) ;
105
105
// No `FMODE_UNSIGNED_OFFSET` support, so `offset` must be in [0, 2^63).
106
106
// See discussion in https://github.com/fishinabarrel/linux-kernel-module-rust/pull/113
107
- T :: read( f, & File :: from_ptr( file) , & mut data, ( * offset) . try_into( ) ?) ?;
108
- let written = len - data. len( ) ;
109
- ( * offset) += bindings:: loff_t:: try_from( written) . unwrap( ) ;
110
- Ok ( written. try_into( ) . unwrap( ) )
107
+ let read = f. read( & File :: from_ptr( file) , & mut data, ( * offset) . try_into( ) ?) ?;
108
+ ( * offset) += bindings:: loff_t:: try_from( read) . unwrap( ) ;
109
+ Ok ( read as _)
111
110
}
112
111
}
113
112
@@ -122,10 +121,9 @@ unsafe extern "C" fn write_callback<T: FileOperations>(
122
121
let f = & * ( ( * file) . private_data as * const T ) ;
123
122
// No `FMODE_UNSIGNED_OFFSET` support, so `offset` must be in [0, 2^63).
124
123
// See discussion in https://github.com/fishinabarrel/linux-kernel-module-rust/pull/113
125
- T :: write( f, & mut data, ( * offset) . try_into( ) ?) ?;
126
- let read = len - data. len( ) ;
127
- ( * offset) += bindings:: loff_t:: try_from( read) . unwrap( ) ;
128
- Ok ( read. try_into( ) . unwrap( ) )
124
+ let written = f. write( & mut data, ( * offset) . try_into( ) ?) ?;
125
+ ( * offset) += bindings:: loff_t:: try_from( written) . unwrap( ) ;
126
+ Ok ( written as _)
129
127
}
130
128
}
131
129
@@ -468,14 +466,19 @@ pub trait FileOperations: Sync + Sized {
468
466
/// Reads data from this file to userspace.
469
467
///
470
468
/// Corresponds to the `read` function pointer in `struct file_operations`.
471
- fn read ( & self , _file : & File , _data : & mut UserSlicePtrWriter , _offset : u64 ) -> KernelResult {
469
+ fn read (
470
+ & self ,
471
+ _file : & File ,
472
+ _data : & mut UserSlicePtrWriter ,
473
+ _offset : u64 ,
474
+ ) -> KernelResult < usize > {
472
475
Err ( Error :: EINVAL )
473
476
}
474
477
475
478
/// Writes data from userspace to this file.
476
479
///
477
480
/// Corresponds to the `write` function pointer in `struct file_operations`.
478
- fn write ( & self , _data : & mut UserSlicePtrReader , _offset : u64 ) -> KernelResult < isize > {
481
+ fn write ( & self , _data : & mut UserSlicePtrReader , _offset : u64 ) -> KernelResult < usize > {
479
482
Err ( Error :: EINVAL )
480
483
}
481
484
0 commit comments