@@ -7,7 +7,10 @@ use kernel::{
7
7
io_buffer:: IoBufferWriter ,
8
8
linked_list:: List ,
9
9
linked_list:: { GetLinks , Links } ,
10
+ macros:: pin_data,
11
+ pin_init,
10
12
prelude:: * ,
13
+ spinlock,
11
14
sync:: { Arc , SpinLock , UniqueArc } ,
12
15
user_ptr:: UserSlicePtrWriter ,
13
16
Either , ScopeGuard ,
@@ -26,7 +29,9 @@ struct TransactionInner {
26
29
file_list : List < Box < FileInfo > > ,
27
30
}
28
31
32
+ #[ pin_data]
29
33
pub ( crate ) struct Transaction {
34
+ #[ pin]
30
35
inner : SpinLock < TransactionInner > ,
31
36
// TODO: Node should be released when the buffer is released.
32
37
node_ref : Option < NodeRef > ,
@@ -55,26 +60,20 @@ impl Transaction {
55
60
let data_address = alloc. ptr ;
56
61
let file_list = alloc. take_file_list ( ) ;
57
62
alloc. keep_alive ( ) ;
58
- let mut tr = Pin :: from ( UniqueArc :: try_new ( Self {
59
- // SAFETY: `spinlock_init` is called below.
60
- inner : unsafe { SpinLock :: new ( TransactionInner { file_list } ) } ,
63
+ let tr = UniqueArc :: pin_init :: < core:: convert:: Infallible > ( pin_init ! ( Self {
64
+ inner: spinlock!( TransactionInner { file_list } , "Transaction::inner" ) ,
61
65
node_ref: Some ( node_ref) ,
62
66
stack_next,
63
67
from: from. clone( ) ,
64
68
to,
65
69
code: tr. code,
66
70
flags: tr. flags,
67
- data_size : tr. data_size as _ ,
71
+ data_size: tr. data_size as usize ,
68
72
data_address,
69
- offsets_size : tr. offsets_size as _ ,
73
+ offsets_size: tr. offsets_size as usize ,
70
74
links: Links :: new( ) ,
71
75
free_allocation: AtomicBool :: new( true ) ,
72
- } ) ?) ;
73
-
74
- // SAFETY: `inner` is pinned when `tr` is.
75
- let pinned = unsafe { tr. as_mut ( ) . map_unchecked_mut ( |t| & mut t. inner ) } ;
76
- kernel:: spinlock_init!( pinned, "Transaction::inner" ) ;
77
-
76
+ } ) ) ?;
78
77
Ok ( tr. into ( ) )
79
78
}
80
79
@@ -88,26 +87,20 @@ impl Transaction {
88
87
let data_address = alloc. ptr ;
89
88
let file_list = alloc. take_file_list ( ) ;
90
89
alloc. keep_alive ( ) ;
91
- let mut tr = Pin :: from ( UniqueArc :: try_new ( Self {
92
- // SAFETY: `spinlock_init` is called below.
93
- inner : unsafe { SpinLock :: new ( TransactionInner { file_list } ) } ,
90
+ let tr = UniqueArc :: pin_init :: < core:: convert:: Infallible > ( pin_init ! ( Self {
91
+ inner: spinlock!( TransactionInner { file_list } , "Transaction::inner" ) ,
94
92
node_ref: None ,
95
93
stack_next: None ,
96
94
from: from. clone( ) ,
97
95
to,
98
96
code: tr. code,
99
97
flags: tr. flags,
100
- data_size : tr. data_size as _ ,
98
+ data_size: tr. data_size as usize ,
101
99
data_address,
102
- offsets_size : tr. offsets_size as _ ,
100
+ offsets_size: tr. offsets_size as usize ,
103
101
links: Links :: new( ) ,
104
102
free_allocation: AtomicBool :: new( true ) ,
105
- } ) ?) ;
106
-
107
- // SAFETY: `inner` is pinned when `tr` is.
108
- let pinned = unsafe { tr. as_mut ( ) . map_unchecked_mut ( |t| & mut t. inner ) } ;
109
- kernel:: spinlock_init!( pinned, "Transaction::inner" ) ;
110
-
103
+ } ) ) ?;
111
104
Ok ( tr. into ( ) )
112
105
}
113
106
0 commit comments