@@ -19,6 +19,7 @@ use kernel::{
19
19
io_buffer:: { IoBufferReader , IoBufferWriter } ,
20
20
miscdev, new_mutex, pin_init,
21
21
sync:: { Arc , ArcBorrow , Mutex } ,
22
+ types:: Opaque ,
22
23
} ;
23
24
24
25
module ! {
@@ -29,22 +30,11 @@ module! {
29
30
license: "GPL" ,
30
31
}
31
32
32
- // Fist I made CompletionDev { completion: bindings::completion }.
33
- // But it didn't work because we cannot get mutable reference to CompletionDev in read/write functions.
34
- // The argument of read/write functions is ArcBorrow<'_, CompletionDev>.
35
- // So it's not allowed to get the mutable reference to CompletionDev.
36
- // The only way to mutate through ArcBorrow is to use Mutex/RwLock/Atomic types.
37
- // (see doc.rust-lang.org/std/sync/struct.Mutex.html)
38
- // Finally I makde CompletionInner struct and put it into Mutex.
39
- struct CompletionInner {
40
- completion : bindings:: completion ,
41
- }
42
-
43
33
// internal info between file operations
44
34
#[ pin_data]
45
35
struct CompletionDev {
46
36
#[ pin]
47
- inner : Mutex < CompletionInner > ,
37
+ completion : Opaque < bindings :: completion > ,
48
38
}
49
39
50
40
// TODO: impl CompletionDev::try_new
@@ -63,17 +53,11 @@ impl CompletionDev {
63
53
let mut key: bindings:: lock_class_key = bindings:: lock_class_key:: default ( ) ;
64
54
compl. done = 0 ;
65
55
unsafe {
66
- bindings:: __init_swait_queue_head (
67
- & mut compl. wait ,
68
- compl_name. as_char_ptr ( ) as * mut core:: ffi:: c_char ,
69
- & mut key,
70
- ) ;
56
+ bindings:: __init_swait_queue_head ( & mut compl. wait , compl_name. as_char_ptr ( ) , & mut key) ;
71
57
}
72
58
73
59
let dev = Arc :: pin_init ( pin_init ! ( Self {
74
- inner <- new_mutex!( CompletionInner {
75
- completion: compl,
76
- } ) ,
60
+ completion: Opaque :: new( compl) ,
77
61
} ) ) ?;
78
62
79
63
Ok ( dev)
@@ -105,9 +89,8 @@ impl file::Operations for RustFile {
105
89
) -> Result < usize > {
106
90
pr_info ! ( "read is invoked\n " ) ;
107
91
108
- let mut inner_guard = shared. inner . lock ( ) ;
109
92
unsafe {
110
- bindings:: wait_for_completion ( & mut inner_guard . completion ) ;
93
+ bindings:: wait_for_completion ( Opaque :: raw_get ( & shared . completion ) ) ;
111
94
}
112
95
113
96
Ok ( 0 )
@@ -121,9 +104,8 @@ impl file::Operations for RustFile {
121
104
) -> Result < usize > {
122
105
pr_info ! ( "write is invoked\n " ) ;
123
106
124
- let mut inner_guard = shared. inner . lock ( ) ;
125
107
unsafe {
126
- bindings:: complete ( & mut inner_guard . completion ) ;
108
+ bindings:: complete ( Opaque :: raw_get ( & shared . completion ) ) ;
127
109
}
128
110
129
111
// return non-zero value to avoid infinite re-try
0 commit comments