@@ -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
@@ -441,14 +439,19 @@ pub trait FileOperations: Send + Sync + Sized {
441
439
/// Reads data from this file to userspace.
442
440
///
443
441
/// Corresponds to the `read` function pointer in `struct file_operations`.
444
- fn read ( & self , _file : & File , _data : & mut UserSlicePtrWriter , _offset : u64 ) -> KernelResult {
442
+ fn read (
443
+ & self ,
444
+ _file : & File ,
445
+ _data : & mut UserSlicePtrWriter ,
446
+ _offset : u64 ,
447
+ ) -> KernelResult < usize > {
445
448
Err ( Error :: EINVAL )
446
449
}
447
450
448
451
/// Writes data from userspace to this file.
449
452
///
450
453
/// Corresponds to the `write` function pointer in `struct file_operations`.
451
- fn write ( & self , _data : & mut UserSlicePtrReader , _offset : u64 ) -> KernelResult < isize > {
454
+ fn write ( & self , _data : & mut UserSlicePtrReader , _offset : u64 ) -> KernelResult < usize > {
452
455
Err ( Error :: EINVAL )
453
456
}
454
457
0 commit comments