@@ -5,12 +5,32 @@ use std::collections::BTreeMap;
5
5
use std:: sync:: Arc ;
6
6
7
7
use super :: file_handle:: FileHandle ;
8
- use super :: { FileOrHandle , Inode , InodeAltKey , InodeData } ;
8
+ use super :: { FileOrHandle , Inode , InodeData , InodeStat } ;
9
+
10
+ #[ derive( Clone , Copy , Default , PartialOrd , Ord , PartialEq , Eq , Debug ) ]
11
+ /// Identify an inode in `PassthroughFs` by `InodeId`.
12
+ pub struct InodeId {
13
+ pub ino : libc:: ino64_t ,
14
+ pub dev : libc:: dev_t ,
15
+ pub mnt : u64 ,
16
+ }
17
+
18
+ impl InodeId {
19
+ #[ inline]
20
+ pub ( super ) fn from_stat ( ist : & InodeStat ) -> Self {
21
+ let st = ist. get_stat ( ) ;
22
+ InodeId {
23
+ ino : st. st_ino ,
24
+ dev : st. st_dev ,
25
+ mnt : ist. get_mnt_id ( ) ,
26
+ }
27
+ }
28
+ }
9
29
10
30
#[ derive( Default ) ]
11
31
pub struct InodeStore {
12
32
data : BTreeMap < Inode , Arc < InodeData > > ,
13
- by_ids : BTreeMap < InodeAltKey , Inode > ,
33
+ by_id : BTreeMap < InodeId , Inode > ,
14
34
by_handle : BTreeMap < Arc < FileHandle > , Inode > ,
15
35
}
16
36
@@ -20,7 +40,7 @@ impl InodeStore {
20
40
/// The caller needs to ensure that no inode with the same key exists, otherwise the old inode
21
41
/// will get lost.
22
42
pub fn insert ( & mut self , data : Arc < InodeData > ) {
23
- self . by_ids . insert ( data. altkey , data. inode ) ;
43
+ self . by_id . insert ( data. id , data. inode ) ;
24
44
if let FileOrHandle :: Handle ( handle) = & data. file_or_handle {
25
45
self . by_handle . insert ( handle. clone ( ) , data. inode ) ;
26
46
}
@@ -31,7 +51,7 @@ impl InodeStore {
31
51
pub fn remove ( & mut self , inode : & Inode , remove_data_only : bool ) -> Option < Arc < InodeData > > {
32
52
let data = self . data . remove ( inode) ;
33
53
if remove_data_only {
34
- // Don't remove by_ids and by_handle, we need use it to store inode
54
+ // Don't remove by_id and by_handle, we need use it to store inode
35
55
// record the mapping of inodes using these two structures to ensure
36
56
// that the same files always use the same inode
37
57
return data;
@@ -41,23 +61,23 @@ impl InodeStore {
41
61
if let FileOrHandle :: Handle ( handle) = & data. file_or_handle {
42
62
self . by_handle . remove ( handle) ;
43
63
}
44
- self . by_ids . remove ( & data. altkey ) ;
64
+ self . by_id . remove ( & data. id ) ;
45
65
}
46
66
data
47
67
}
48
68
49
69
pub fn clear ( & mut self ) {
50
70
self . data . clear ( ) ;
51
71
self . by_handle . clear ( ) ;
52
- self . by_ids . clear ( ) ;
72
+ self . by_id . clear ( ) ;
53
73
}
54
74
55
75
pub fn get ( & self , inode : & Inode ) -> Option < & Arc < InodeData > > {
56
76
self . data . get ( inode)
57
77
}
58
78
59
- pub fn get_by_ids ( & self , ids : & InodeAltKey ) -> Option < & Arc < InodeData > > {
60
- let inode = self . inode_by_ids ( ids ) ?;
79
+ pub fn get_by_id ( & self , id : & InodeId ) -> Option < & Arc < InodeData > > {
80
+ let inode = self . inode_by_id ( id ) ?;
61
81
self . get ( inode)
62
82
}
63
83
@@ -66,8 +86,8 @@ impl InodeStore {
66
86
self . get ( inode)
67
87
}
68
88
69
- pub fn inode_by_ids ( & self , ids : & InodeAltKey ) -> Option < & Inode > {
70
- self . by_ids . get ( ids )
89
+ pub fn inode_by_id ( & self , id : & InodeId ) -> Option < & Inode > {
90
+ self . by_id . get ( id )
71
91
}
72
92
73
93
pub fn inode_by_handle ( & self , handle : & FileHandle ) -> Option < & Inode > {
@@ -88,7 +108,7 @@ mod test {
88
108
impl PartialEq for InodeData {
89
109
fn eq ( & self , other : & Self ) -> bool {
90
110
if self . inode != other. inode
91
- || self . altkey != other. altkey
111
+ || self . id != other. id
92
112
|| self . mode != other. mode
93
113
|| self . refcount . load ( Ordering :: Relaxed ) != other. refcount . load ( Ordering :: Relaxed )
94
114
{
@@ -142,22 +162,22 @@ mod test {
142
162
stat : stat_fd ( tmpfile2. as_file ( ) . as_raw_fd ( ) ) . unwrap ( ) ,
143
163
mnt_id : 0 ,
144
164
} ;
145
- let ids1 = InodeAltKey :: ids_from_stat ( & inode_stat1) ;
146
- let ids2 = InodeAltKey :: ids_from_stat ( & inode_stat2) ;
165
+ let id1 = InodeId :: from_stat ( & inode_stat1) ;
166
+ let id2 = InodeId :: from_stat ( & inode_stat2) ;
147
167
let file_or_handle1 = FileOrHandle :: File ( tmpfile1. into_file ( ) ) ;
148
168
let file_or_handle2 = FileOrHandle :: File ( tmpfile2. into_file ( ) ) ;
149
169
let data1 = InodeData :: new (
150
170
inode1,
151
171
file_or_handle1,
152
172
2 ,
153
- ids1 ,
173
+ id1 ,
154
174
inode_stat1. get_stat ( ) . st_mode ,
155
175
) ;
156
176
let data2 = InodeData :: new (
157
177
inode2,
158
178
file_or_handle2,
159
179
2 ,
160
- ids2 ,
180
+ id2 ,
161
181
inode_stat2. get_stat ( ) . st_mode ,
162
182
) ;
163
183
let data1 = Arc :: new ( data1) ;
@@ -169,39 +189,39 @@ mod test {
169
189
assert ! ( m. get( & 1 ) . is_none( ) ) ;
170
190
171
191
// get just inserted value by key, by id, by handle
172
- assert ! ( m. get_by_ids ( & InodeAltKey :: default ( ) ) . is_none( ) ) ;
192
+ assert ! ( m. get_by_id ( & InodeId :: default ( ) ) . is_none( ) ) ;
173
193
assert ! ( m. get_by_handle( & FileHandle :: default ( ) ) . is_none( ) ) ;
174
194
assert_eq ! ( m. get( & inode1) . unwrap( ) , & data1) ;
175
- assert_eq ! ( m. get_by_ids ( & ids1 ) . unwrap( ) , & data1) ;
195
+ assert_eq ! ( m. get_by_id ( & id1 ) . unwrap( ) , & data1) ;
176
196
177
197
// insert another value, and check again
178
198
m. insert ( data2. clone ( ) ) ;
179
199
assert ! ( m. get( & 1 ) . is_none( ) ) ;
180
- assert ! ( m. get_by_ids ( & InodeAltKey :: default ( ) ) . is_none( ) ) ;
200
+ assert ! ( m. get_by_id ( & InodeId :: default ( ) ) . is_none( ) ) ;
181
201
assert ! ( m. get_by_handle( & FileHandle :: default ( ) ) . is_none( ) ) ;
182
202
assert_eq ! ( m. get( & inode1) . unwrap( ) , & data1) ;
183
- assert_eq ! ( m. get_by_ids ( & ids1 ) . unwrap( ) , & data1) ;
203
+ assert_eq ! ( m. get_by_id ( & id1 ) . unwrap( ) , & data1) ;
184
204
assert_eq ! ( m. get( & inode2) . unwrap( ) , & data2) ;
185
- assert_eq ! ( m. get_by_ids ( & ids2 ) . unwrap( ) , & data2) ;
205
+ assert_eq ! ( m. get_by_id ( & id2 ) . unwrap( ) , & data2) ;
186
206
187
207
// remove non-present key
188
208
assert ! ( m. remove( & 1 , false ) . is_none( ) ) ;
189
209
190
210
// remove present key, return its value
191
211
assert_eq ! ( m. remove( & inode1, false ) . unwrap( ) , data1. clone( ) ) ;
192
212
assert ! ( m. get( & inode1) . is_none( ) ) ;
193
- assert ! ( m. get_by_ids ( & ids1 ) . is_none( ) ) ;
213
+ assert ! ( m. get_by_id ( & id1 ) . is_none( ) ) ;
194
214
assert_eq ! ( m. get( & inode2) . unwrap( ) , & data2) ;
195
- assert_eq ! ( m. get_by_ids ( & ids2 ) . unwrap( ) , & data2) ;
215
+ assert_eq ! ( m. get_by_id ( & id2 ) . unwrap( ) , & data2) ;
196
216
197
217
// clear the map
198
218
m. clear ( ) ;
199
219
assert ! ( m. get( & 1 ) . is_none( ) ) ;
200
- assert ! ( m. get_by_ids ( & InodeAltKey :: default ( ) ) . is_none( ) ) ;
220
+ assert ! ( m. get_by_id ( & InodeId :: default ( ) ) . is_none( ) ) ;
201
221
assert ! ( m. get_by_handle( & FileHandle :: default ( ) ) . is_none( ) ) ;
202
222
assert ! ( m. get( & inode1) . is_none( ) ) ;
203
- assert ! ( m. get_by_ids ( & ids1 ) . is_none( ) ) ;
223
+ assert ! ( m. get_by_id ( & id1 ) . is_none( ) ) ;
204
224
assert ! ( m. get( & inode2) . is_none( ) ) ;
205
- assert ! ( m. get_by_ids ( & ids2 ) . is_none( ) ) ;
225
+ assert ! ( m. get_by_id ( & id2 ) . is_none( ) ) ;
206
226
}
207
227
}
0 commit comments