17
17
* under the License.
18
18
*/
19
19
use crate :: filesystem:: {
20
- FileStat , PathFileSystem , RawFileSystem , INITIAL_FILE_ID , ROOT_DIR_FILE_ID ,
20
+ FileStat , PathFileSystem , RawFileSystem , Result , INITIAL_FILE_ID , ROOT_DIR_FILE_ID ,
21
21
ROOT_DIR_PARENT_FILE_ID , ROOT_DIR_PATH ,
22
22
} ;
23
23
use crate :: opened_file:: { FileHandle , OpenFileFlags } ;
@@ -61,7 +61,7 @@ impl<T: PathFileSystem> DefaultRawFileSystem<T> {
61
61
. fetch_add ( 1 , std:: sync:: atomic:: Ordering :: SeqCst )
62
62
}
63
63
64
- async fn get_file_entry ( & self , file_id : u64 ) -> crate :: filesystem :: Result < FileEntry > {
64
+ async fn get_file_entry ( & self , file_id : u64 ) -> Result < FileEntry > {
65
65
self . file_entry_manager
66
66
. read ( )
67
67
. await
@@ -97,7 +97,7 @@ impl<T: PathFileSystem> DefaultRawFileSystem<T> {
97
97
file_id : u64 ,
98
98
flags : u32 ,
99
99
kind : FileType ,
100
- ) -> crate :: filesystem :: Result < FileHandle > {
100
+ ) -> Result < FileHandle > {
101
101
let file_entry = self . get_file_entry ( file_id) . await ?;
102
102
103
103
let mut opened_file = {
@@ -121,28 +121,37 @@ impl<T: PathFileSystem> DefaultRawFileSystem<T> {
121
121
let file = file. lock ( ) . await ;
122
122
Ok ( file. file_handle ( ) )
123
123
}
124
+
125
+ async fn remove_file_entry_locked ( & self , path : & Path ) {
126
+ let mut file_manager = self . file_entry_manager . write ( ) . await ;
127
+ file_manager. remove ( path) ;
128
+ }
129
+
130
+ async fn insert_file_entry_locked ( & self , parent_file_id : u64 , file_id : u64 , path : & Path ) {
131
+ let mut file_manager = self . file_entry_manager . write ( ) . await ;
132
+ file_manager. insert ( parent_file_id, file_id, path) ;
133
+ }
124
134
}
125
135
126
136
#[ async_trait]
127
137
impl < T : PathFileSystem > RawFileSystem for DefaultRawFileSystem < T > {
128
- async fn init ( & self ) -> crate :: filesystem :: Result < ( ) > {
138
+ async fn init ( & self ) -> Result < ( ) > {
129
139
// init root directory
130
- self . file_entry_manager . write ( ) . await . insert (
140
+ self . insert_file_entry_locked (
131
141
ROOT_DIR_PARENT_FILE_ID ,
132
142
ROOT_DIR_FILE_ID ,
133
143
Path :: new ( ROOT_DIR_PATH ) ,
134
- ) ;
144
+ )
145
+ . await ;
135
146
self . fs . init ( ) . await
136
147
}
137
148
138
- async fn get_file_path ( & self , file_id : u64 ) -> String {
139
- let file_entry = self . get_file_entry ( file_id) . await ;
140
- file_entry
141
- . map ( |x| x. path . to_string_lossy ( ) . to_string ( ) )
142
- . unwrap_or_else ( |_| "" . to_string ( ) )
149
+ async fn get_file_path ( & self , file_id : u64 ) -> Result < String > {
150
+ let file_entry = self . get_file_entry ( file_id) . await ?;
151
+ Ok ( file_entry. path . to_string_lossy ( ) . to_string ( ) )
143
152
}
144
153
145
- async fn valid_file_handle_id ( & self , file_id : u64 , fh : u64 ) -> crate :: filesystem :: Result < ( ) > {
154
+ async fn valid_file_handle_id ( & self , file_id : u64 , fh : u64 ) -> Result < ( ) > {
146
155
let fh_file_id = self
147
156
. opened_file_manager
148
157
. get ( fh)
@@ -157,7 +166,7 @@ impl<T: PathFileSystem> RawFileSystem for DefaultRawFileSystem<T> {
157
166
. ok_or ( Errno :: from ( libc:: EBADF ) )
158
167
}
159
168
160
- async fn stat ( & self , file_id : u64 ) -> crate :: filesystem :: Result < FileStat > {
169
+ async fn stat ( & self , file_id : u64 ) -> Result < FileStat > {
161
170
let file_entry = self . get_file_entry ( file_id) . await ?;
162
171
let mut file_stat = self . fs . stat ( & file_entry. path ) . await ?;
163
172
file_stat. set_file_id ( file_entry. parent_file_id , file_entry. file_id ) ;
@@ -181,21 +190,22 @@ impl<T: PathFileSystem> RawFileSystem for DefaultRawFileSystem<T> {
181
190
Ok ( file_stat)
182
191
}
183
192
184
- async fn read_dir ( & self , file_id : u64 ) -> crate :: filesystem :: Result < Vec < FileStat > > {
193
+ async fn read_dir ( & self , file_id : u64 ) -> Result < Vec < FileStat > > {
185
194
let file_entry = self . get_file_entry ( file_id) . await ?;
186
195
let mut child_filestats = self . fs . read_dir ( & file_entry. path ) . await ?;
187
- for file in child_filestats. iter_mut ( ) {
188
- self . resolve_file_id_to_filestat ( file, file_id) . await ;
196
+ for file_stat in child_filestats. iter_mut ( ) {
197
+ self . resolve_file_id_to_filestat ( file_stat, file_stat. file_id )
198
+ . await ;
189
199
}
190
200
Ok ( child_filestats)
191
201
}
192
202
193
- async fn open_file ( & self , file_id : u64 , flags : u32 ) -> crate :: filesystem :: Result < FileHandle > {
203
+ async fn open_file ( & self , file_id : u64 , flags : u32 ) -> Result < FileHandle > {
194
204
self . open_file_internal ( file_id, flags, FileType :: RegularFile )
195
205
. await
196
206
}
197
207
198
- async fn open_dir ( & self , file_id : u64 , flags : u32 ) -> crate :: filesystem :: Result < FileHandle > {
208
+ async fn open_dir ( & self , file_id : u64 , flags : u32 ) -> Result < FileHandle > {
199
209
self . open_file_internal ( file_id, flags, FileType :: Directory )
200
210
. await
201
211
}
@@ -205,84 +215,70 @@ impl<T: PathFileSystem> RawFileSystem for DefaultRawFileSystem<T> {
205
215
parent_file_id : u64 ,
206
216
name : & OsStr ,
207
217
flags : u32 ,
208
- ) -> crate :: filesystem :: Result < FileHandle > {
218
+ ) -> Result < FileHandle > {
209
219
let parent_file_entry = self . get_file_entry ( parent_file_id) . await ?;
210
- let path = parent_file_entry. path . join ( name) ;
211
- let mut opened_file = self . fs . create_file ( & path, OpenFileFlags ( flags) ) . await ?;
220
+ let mut file_without_id = self
221
+ . fs
222
+ . create_file ( & parent_file_entry. path . join ( name) , OpenFileFlags ( flags) )
223
+ . await ?;
212
224
213
- opened_file . set_file_id ( parent_file_id, self . next_file_id ( ) ) ;
225
+ file_without_id . set_file_id ( parent_file_id, self . next_file_id ( ) ) ;
214
226
215
227
// insert the new file to file entry manager
216
- {
217
- let mut file_manager = self . file_entry_manager . write ( ) . await ;
218
- file_manager. insert (
219
- parent_file_id,
220
- opened_file. file_stat . file_id ,
221
- & opened_file. file_stat . path ,
222
- ) ;
223
- }
224
-
225
- // put the file to the opened file manager
226
- let opened_file = self . opened_file_manager . put ( opened_file) ;
227
- let opened_file = opened_file. lock ( ) . await ;
228
- Ok ( opened_file. file_handle ( ) )
228
+ self . insert_file_entry_locked (
229
+ parent_file_id,
230
+ file_without_id. file_stat . file_id ,
231
+ & file_without_id. file_stat . path ,
232
+ )
233
+ . await ;
234
+
235
+ // put the openfile to the opened file manager and allocate a file handle id
236
+ let file_with_id = self . opened_file_manager . put ( file_without_id) ;
237
+ let opened_file_with_file_handle_id = file_with_id. lock ( ) . await ;
238
+ Ok ( opened_file_with_file_handle_id. file_handle ( ) )
229
239
}
230
240
231
- async fn create_dir (
232
- & self ,
233
- parent_file_id : u64 ,
234
- name : & OsStr ,
235
- ) -> crate :: filesystem:: Result < u64 > {
241
+ async fn create_dir ( & self , parent_file_id : u64 , name : & OsStr ) -> Result < u64 > {
236
242
let parent_file_entry = self . get_file_entry ( parent_file_id) . await ?;
237
243
let path = parent_file_entry. path . join ( name) ;
238
244
let mut filestat = self . fs . create_dir ( & path) . await ?;
239
245
240
246
filestat. set_file_id ( parent_file_id, self . next_file_id ( ) ) ;
241
247
242
248
// insert the new file to file entry manager
243
- {
244
- let mut file_manager = self . file_entry_manager . write ( ) . await ;
245
- file_manager. insert ( filestat. parent_file_id , filestat. file_id , & filestat. path ) ;
246
- }
249
+ self . insert_file_entry_locked ( parent_file_id, filestat. file_id , & filestat. path )
250
+ . await ;
247
251
Ok ( filestat. file_id )
248
252
}
249
253
250
- async fn set_attr ( & self , file_id : u64 , file_stat : & FileStat ) -> crate :: filesystem :: Result < ( ) > {
254
+ async fn set_attr ( & self , file_id : u64 , file_stat : & FileStat ) -> Result < ( ) > {
251
255
let file_entry = self . get_file_entry ( file_id) . await ?;
252
256
self . fs . set_attr ( & file_entry. path , file_stat, true ) . await
253
257
}
254
258
255
- async fn remove_file (
256
- & self ,
257
- parent_file_id : u64 ,
258
- name : & OsStr ,
259
- ) -> crate :: filesystem:: Result < ( ) > {
259
+ async fn remove_file ( & self , parent_file_id : u64 , name : & OsStr ) -> Result < ( ) > {
260
260
let parent_file_entry = self . get_file_entry ( parent_file_id) . await ?;
261
261
let path = parent_file_entry. path . join ( name) ;
262
262
self . fs . remove_file ( & path) . await ?;
263
263
264
264
// remove the file from file entry manager
265
- {
266
- let mut file_manager = self . file_entry_manager . write ( ) . await ;
267
- file_manager. remove ( & path) ;
268
- }
265
+ self . remove_file_entry_locked ( & parent_file_entry. path . join ( name) )
266
+ . await ;
269
267
Ok ( ( ) )
270
268
}
271
269
272
- async fn remove_dir ( & self , parent_file_id : u64 , name : & OsStr ) -> crate :: filesystem :: Result < ( ) > {
270
+ async fn remove_dir ( & self , parent_file_id : u64 , name : & OsStr ) -> Result < ( ) > {
273
271
let parent_file_entry = self . get_file_entry ( parent_file_id) . await ?;
274
272
let path = parent_file_entry. path . join ( name) ;
275
273
self . fs . remove_dir ( & path) . await ?;
276
274
277
275
// remove the dir from file entry manager
278
- {
279
- let mut file_manager = self . file_entry_manager . write ( ) . await ;
280
- file_manager. remove ( & path) ;
281
- }
276
+ self . remove_file_entry_locked ( & parent_file_entry. path . join ( name) )
277
+ . await ;
282
278
Ok ( ( ) )
283
279
}
284
280
285
- async fn close_file ( & self , _file_id : u64 , fh : u64 ) -> crate :: filesystem :: Result < ( ) > {
281
+ async fn close_file ( & self , _file_id : u64 , fh : u64 ) -> Result < ( ) > {
286
282
let opened_file = self
287
283
. opened_file_manager
288
284
. remove ( fh)
@@ -298,15 +294,14 @@ impl<T: PathFileSystem> RawFileSystem for DefaultRawFileSystem<T> {
298
294
offset : u64 ,
299
295
size : u32 ,
300
296
) -> crate :: filesystem:: Result < Bytes > {
301
- let file_stat: FileStat ;
302
- let data = {
297
+ let ( data, file_stat) = {
303
298
let opened_file = self
304
299
. opened_file_manager
305
300
. get ( fh)
306
301
. ok_or ( Errno :: from ( libc:: EBADF ) ) ?;
307
302
let mut opened_file = opened_file. lock ( ) . await ;
308
- file_stat = opened_file. file_stat . clone ( ) ;
309
- opened_file . read ( offset , size ) . await
303
+ let data = opened_file. read ( offset , size ) . await ;
304
+ ( data , opened_file . file_stat . clone ( ) )
310
305
} ;
311
306
312
307
// update the file atime
0 commit comments