@@ -57,10 +57,10 @@ impl PollTable {
57
57
58
58
// SAFETY: `PollTable::ptr` is guaranteed to be valid by the type invariants and the null
59
59
// check above.
60
- let table = & * self . ptr ;
60
+ let table = unsafe { & * self . ptr } ;
61
61
if let Some ( proc) = table. _qproc {
62
62
// SAFETY: All pointers are known to be valid.
63
- proc ( file. ptr as _ , cv. wait_list . get ( ) , self . ptr )
63
+ unsafe { proc ( file. ptr as _ , cv. wait_list . get ( ) , self . ptr ) }
64
64
}
65
65
}
66
66
}
@@ -84,9 +84,9 @@ unsafe extern "C" fn open_callback<A: FileOpenAdapter, T: FileOpener<A::Arg>>(
84
84
file : * mut bindings:: file ,
85
85
) -> c_types:: c_int {
86
86
from_kernel_result ! {
87
- let arg = A :: convert( inode, file) ;
88
- let ptr = T :: open( & * arg) ?. into_pointer( ) ;
89
- ( * file) . private_data = ptr as * mut c_types:: c_void;
87
+ let arg = unsafe { A :: convert( inode, file) } ;
88
+ let ptr = T :: open( unsafe { & * arg } ) ?. into_pointer( ) ;
89
+ unsafe { ( * file) . private_data = ptr as * mut c_types:: c_void } ;
90
90
Ok ( 0 )
91
91
}
92
92
}
@@ -98,12 +98,12 @@ unsafe extern "C" fn read_callback<T: FileOperations>(
98
98
offset : * mut bindings:: loff_t ,
99
99
) -> c_types:: c_ssize_t {
100
100
from_kernel_result ! {
101
- let mut data = UserSlicePtr :: new( buf as * mut c_types:: c_void, len) . writer( ) ;
102
- let f = & * ( ( * file) . private_data as * const T ) ;
101
+ let mut data = unsafe { UserSlicePtr :: new( buf as * mut c_types:: c_void, len) . writer( ) } ;
102
+ let f = unsafe { & * ( ( * file) . private_data as * const T ) } ;
103
103
// No `FMODE_UNSIGNED_OFFSET` support, so `offset` must be in [0, 2^63).
104
104
// See discussion in https://github.com/fishinabarrel/linux-kernel-module-rust/pull/113
105
- let read = f. read( & FileRef :: from_ptr( file) , & mut data, ( * offset) . try_into( ) ?) ?;
106
- ( * offset) += bindings:: loff_t:: try_from( read) . unwrap( ) ;
105
+ let read = f. read( unsafe { & FileRef :: from_ptr( file) } , & mut data, unsafe { * offset } . try_into( ) ?) ?;
106
+ unsafe { ( * offset) += bindings:: loff_t:: try_from( read) . unwrap( ) } ;
107
107
Ok ( read as _)
108
108
}
109
109
}
@@ -113,12 +113,12 @@ unsafe extern "C" fn read_iter_callback<T: FileOperations>(
113
113
raw_iter : * mut bindings:: iov_iter ,
114
114
) -> isize {
115
115
from_kernel_result ! {
116
- let mut iter = IovIter :: from_ptr( raw_iter) ;
117
- let file = ( * iocb) . ki_filp;
118
- let offset = ( * iocb) . ki_pos;
119
- let f = & * ( ( * file) . private_data as * const T ) ;
120
- let read = f. read( & FileRef :: from_ptr( file) , & mut iter, offset. try_into( ) ?) ?;
121
- ( * iocb) . ki_pos += bindings:: loff_t:: try_from( read) . unwrap( ) ;
116
+ let mut iter = unsafe { IovIter :: from_ptr( raw_iter) } ;
117
+ let file = unsafe { ( * iocb) . ki_filp } ;
118
+ let offset = unsafe { ( * iocb) . ki_pos } ;
119
+ let f = unsafe { & * ( ( * file) . private_data as * const T ) } ;
120
+ let read = f. read( unsafe { & FileRef :: from_ptr( file) } , & mut iter, offset. try_into( ) ?) ?;
121
+ unsafe { ( * iocb) . ki_pos += bindings:: loff_t:: try_from( read) . unwrap( ) } ;
122
122
Ok ( read as _)
123
123
}
124
124
}
@@ -130,12 +130,12 @@ unsafe extern "C" fn write_callback<T: FileOperations>(
130
130
offset : * mut bindings:: loff_t ,
131
131
) -> c_types:: c_ssize_t {
132
132
from_kernel_result ! {
133
- let mut data = UserSlicePtr :: new( buf as * mut c_types:: c_void, len) . reader( ) ;
134
- let f = & * ( ( * file) . private_data as * const T ) ;
133
+ let mut data = unsafe { UserSlicePtr :: new( buf as * mut c_types:: c_void, len) . reader( ) } ;
134
+ let f = unsafe { & * ( ( * file) . private_data as * const T ) } ;
135
135
// No `FMODE_UNSIGNED_OFFSET` support, so `offset` must be in [0, 2^63).
136
136
// See discussion in https://github.com/fishinabarrel/linux-kernel-module-rust/pull/113
137
- let written = f. write( & FileRef :: from_ptr( file) , & mut data, ( * offset) . try_into( ) ?) ?;
138
- ( * offset) += bindings:: loff_t:: try_from( written) . unwrap( ) ;
137
+ let written = f. write( unsafe { & FileRef :: from_ptr( file) } , & mut data, unsafe { * offset } . try_into( ) ?) ?;
138
+ unsafe { ( * offset) += bindings:: loff_t:: try_from( written) . unwrap( ) } ;
139
139
Ok ( written as _)
140
140
}
141
141
}
@@ -145,12 +145,12 @@ unsafe extern "C" fn write_iter_callback<T: FileOperations>(
145
145
raw_iter : * mut bindings:: iov_iter ,
146
146
) -> isize {
147
147
from_kernel_result ! {
148
- let mut iter = IovIter :: from_ptr( raw_iter) ;
149
- let file = ( * iocb) . ki_filp;
150
- let offset = ( * iocb) . ki_pos;
151
- let f = & * ( ( * file) . private_data as * const T ) ;
152
- let written = f. write( & FileRef :: from_ptr( file) , & mut iter, offset. try_into( ) ?) ?;
153
- ( * iocb) . ki_pos += bindings:: loff_t:: try_from( written) . unwrap( ) ;
148
+ let mut iter = unsafe { IovIter :: from_ptr( raw_iter) } ;
149
+ let file = unsafe { ( * iocb) . ki_filp } ;
150
+ let offset = unsafe { ( * iocb) . ki_pos } ;
151
+ let f = unsafe { & * ( ( * file) . private_data as * const T ) } ;
152
+ let written = f. write( unsafe { & FileRef :: from_ptr( file) } , & mut iter, offset. try_into( ) ?) ?;
153
+ unsafe { ( * iocb) . ki_pos += bindings:: loff_t:: try_from( written) . unwrap( ) } ;
154
154
Ok ( written as _)
155
155
}
156
156
}
@@ -159,8 +159,10 @@ unsafe extern "C" fn release_callback<T: FileOperations>(
159
159
_inode : * mut bindings:: inode ,
160
160
file : * mut bindings:: file ,
161
161
) -> c_types:: c_int {
162
- let ptr = mem:: replace ( & mut ( * file) . private_data , ptr:: null_mut ( ) ) ;
163
- T :: release ( T :: Wrapper :: from_pointer ( ptr as _ ) , & FileRef :: from_ptr ( file) ) ;
162
+ let ptr = mem:: replace ( unsafe { & mut ( * file) . private_data } , ptr:: null_mut ( ) ) ;
163
+ T :: release ( unsafe { T :: Wrapper :: from_pointer ( ptr as _ ) } , unsafe {
164
+ & FileRef :: from_ptr ( file)
165
+ } ) ;
164
166
0
165
167
}
166
168
@@ -176,8 +178,8 @@ unsafe extern "C" fn llseek_callback<T: FileOperations>(
176
178
bindings:: SEEK_END => SeekFrom :: End ( offset) ,
177
179
_ => return Err ( Error :: EINVAL ) ,
178
180
} ;
179
- let f = & * ( ( * file) . private_data as * const T ) ;
180
- let off = f. seek( & FileRef :: from_ptr( file) , off) ?;
181
+ let f = unsafe { & * ( ( * file) . private_data as * const T ) } ;
182
+ let off = f. seek( unsafe { & FileRef :: from_ptr( file) } , off) ?;
181
183
Ok ( off as bindings:: loff_t)
182
184
}
183
185
}
@@ -188,10 +190,10 @@ unsafe extern "C" fn unlocked_ioctl_callback<T: FileOperations>(
188
190
arg : c_types:: c_ulong ,
189
191
) -> c_types:: c_long {
190
192
from_kernel_result ! {
191
- let f = & * ( ( * file) . private_data as * const T ) ;
193
+ let f = unsafe { & * ( ( * file) . private_data as * const T ) } ;
192
194
// SAFETY: This function is called by the kernel, so it must set `fs` appropriately.
193
195
let mut cmd = IoctlCommand :: new( cmd as _, arg as _) ;
194
- let ret = f. ioctl( & FileRef :: from_ptr( file) , & mut cmd) ?;
196
+ let ret = f. ioctl( unsafe { & FileRef :: from_ptr( file) } , & mut cmd) ?;
195
197
Ok ( ret as _)
196
198
}
197
199
}
@@ -202,10 +204,10 @@ unsafe extern "C" fn compat_ioctl_callback<T: FileOperations>(
202
204
arg : c_types:: c_ulong ,
203
205
) -> c_types:: c_long {
204
206
from_kernel_result ! {
205
- let f = & * ( ( * file) . private_data as * const T ) ;
207
+ let f = unsafe { & * ( ( * file) . private_data as * const T ) } ;
206
208
// SAFETY: This function is called by the kernel, so it must set `fs` appropriately.
207
209
let mut cmd = IoctlCommand :: new( cmd as _, arg as _) ;
208
- let ret = f. compat_ioctl( & FileRef :: from_ptr( file) , & mut cmd) ?;
210
+ let ret = f. compat_ioctl( unsafe { & FileRef :: from_ptr( file) } , & mut cmd) ?;
209
211
Ok ( ret as _)
210
212
}
211
213
}
@@ -215,8 +217,8 @@ unsafe extern "C" fn mmap_callback<T: FileOperations>(
215
217
vma : * mut bindings:: vm_area_struct ,
216
218
) -> c_types:: c_int {
217
219
from_kernel_result ! {
218
- let f = & * ( ( * file) . private_data as * const T ) ;
219
- f. mmap( & FileRef :: from_ptr( file) , & mut * vma) ?;
220
+ let f = unsafe { & * ( ( * file) . private_data as * const T ) } ;
221
+ f. mmap( unsafe { & FileRef :: from_ptr( file) } , unsafe { & mut * vma } ) ?;
220
222
Ok ( 0 )
221
223
}
222
224
}
@@ -231,8 +233,8 @@ unsafe extern "C" fn fsync_callback<T: FileOperations>(
231
233
let start = start. try_into( ) ?;
232
234
let end = end. try_into( ) ?;
233
235
let datasync = datasync != 0 ;
234
- let f = & * ( ( * file) . private_data as * const T ) ;
235
- let res = f. fsync( & FileRef :: from_ptr( file) , start, end, datasync) ?;
236
+ let f = unsafe { & * ( ( * file) . private_data as * const T ) } ;
237
+ let res = f. fsync( unsafe { & FileRef :: from_ptr( file) } , start, end, datasync) ?;
236
238
Ok ( res. try_into( ) . unwrap( ) )
237
239
}
238
240
}
@@ -241,8 +243,10 @@ unsafe extern "C" fn poll_callback<T: FileOperations>(
241
243
file : * mut bindings:: file ,
242
244
wait : * mut bindings:: poll_table_struct ,
243
245
) -> bindings:: __poll_t {
244
- let f = & * ( ( * file) . private_data as * const T ) ;
245
- match f. poll ( & FileRef :: from_ptr ( file) , & PollTable :: from_ptr ( wait) ) {
246
+ let f = unsafe { & * ( ( * file) . private_data as * const T ) } ;
247
+ match f. poll ( unsafe { & FileRef :: from_ptr ( file) } , unsafe {
248
+ & PollTable :: from_ptr ( wait)
249
+ } ) {
246
250
Ok ( v) => v,
247
251
Err ( _) => bindings:: POLLERR ,
248
252
}
0 commit comments