@@ -6,6 +6,7 @@ use std::path::Path;
6
6
use std:: sync:: { Arc , Mutex } ;
7
7
8
8
use crate :: checksum;
9
+ use crate :: error:: * ;
9
10
use crate :: io_engine:: { AsyncIoEngine , Block , IoEngine , SyncIoEngine } ;
10
11
use crate :: pdata:: btree:: { self , * } ;
11
12
use crate :: pdata:: btree_walker:: * ;
@@ -205,16 +206,17 @@ fn emit_leaf(v: &mut MappingVisitor, b: &Block) -> Result<()> {
205
206
Ok ( ( ) )
206
207
}
207
208
208
- fn read_for < T > ( engine : Arc < dyn IoEngine > , blocks : & [ u64 ] , mut t : T ) -> Result < ( ) >
209
+ fn read_for < T > ( engine : Arc < dyn IoEngine > , blocks : & [ u64 ] , mut t : T ) -> Result < ( ) , IoError >
209
210
where
210
211
T : FnMut ( Block ) -> Result < ( ) > ,
211
212
{
212
213
for cs in blocks. chunks ( engine. get_batch_size ( ) ) {
213
214
for b in engine
214
215
. read_many ( cs)
215
- . map_err ( |_e| anyhow ! ( "read_many failed" ) ) ?
216
+ . map_err ( |_e| IoError :: Input ( anyhow ! ( "read_many failed" ) ) ) ?
216
217
{
217
- t ( b. map_err ( |_e| anyhow ! ( "read of individual block failed" ) ) ?) ?;
218
+ let blk = b. map_err ( |_e| IoError :: Input ( anyhow ! ( "read of individual block failed" ) ) ) ?;
219
+ t ( blk) . map_err ( to_output_err) ?;
218
220
}
219
221
}
220
222
@@ -225,7 +227,7 @@ fn emit_leaves(
225
227
engine : Arc < dyn IoEngine > ,
226
228
out : & mut dyn MetadataVisitor ,
227
229
leaves : & [ u64 ] ,
228
- ) -> Result < ( ) > {
230
+ ) -> Result < ( ) , IoError > {
229
231
let mut v = MappingVisitor :: new ( out) ;
230
232
let proc = |b| {
231
233
emit_leaf ( & mut v, & b) ?;
@@ -234,14 +236,14 @@ fn emit_leaves(
234
236
235
237
read_for ( engine, leaves, proc) ?;
236
238
v. end_walk ( )
237
- . map_err ( |e| anyhow ! ( "failed to emit leaves: {}" , e) )
239
+ . map_err ( |e| IoError :: Output ( anyhow ! ( "failed to emit leaves: {}" , e) ) )
238
240
}
239
241
240
242
fn emit_entries (
241
243
engine : Arc < dyn IoEngine > ,
242
244
out : & mut dyn MetadataVisitor ,
243
245
entries : & [ Entry ] ,
244
- ) -> Result < ( ) > {
246
+ ) -> Result < ( ) , IoError > {
245
247
let mut leaves = Vec :: new ( ) ;
246
248
247
249
for e in entries {
@@ -255,7 +257,7 @@ fn emit_entries(
255
257
leaves. clear ( ) ;
256
258
}
257
259
let str = format ! ( "{}" , id) ;
258
- out. ref_shared ( & str) ?;
260
+ out. ref_shared ( & str) . map_err ( to_output_err ) ?;
259
261
}
260
262
}
261
263
}
@@ -272,8 +274,9 @@ pub fn dump_metadata(
272
274
out : & mut dyn MetadataVisitor ,
273
275
sb : & Superblock ,
274
276
md : & Metadata ,
275
- ) -> Result < ( ) > {
276
- let data_root = unpack :: < SMRoot > ( & sb. data_sm_root [ 0 ..] ) ?;
277
+ ) -> Result < ( ) , IoError > {
278
+ let data_root =
279
+ unpack :: < SMRoot > ( & sb. data_sm_root [ 0 ..] ) . map_err ( |e| IoError :: Input ( e. into ( ) ) ) ?;
277
280
let out_sb = ir:: Superblock {
278
281
uuid : "" . to_string ( ) ,
279
282
time : sb. time ,
@@ -284,12 +287,13 @@ pub fn dump_metadata(
284
287
nr_data_blocks : data_root. nr_blocks ,
285
288
metadata_snap : None ,
286
289
} ;
287
- out. superblock_b ( & out_sb) ?;
290
+ out. superblock_b ( & out_sb) . map_err ( to_output_err ) ?;
288
291
289
292
for d in & md. defs {
290
- out. def_shared_b ( & format ! ( "{}" , d. def_id) ) ?;
293
+ out. def_shared_b ( & format ! ( "{}" , d. def_id) )
294
+ . map_err ( to_output_err) ?;
291
295
emit_entries ( engine. clone ( ) , out, & d. map . entries ) ?;
292
- out. def_shared_e ( ) ?;
296
+ out. def_shared_e ( ) . map_err ( to_output_err ) ?;
293
297
}
294
298
295
299
for dev in & md. devs {
@@ -300,38 +304,42 @@ pub fn dump_metadata(
300
304
creation_time : dev. detail . creation_time ,
301
305
snap_time : dev. detail . snapshotted_time ,
302
306
} ;
303
- out. device_b ( & device) ?;
307
+ out. device_b ( & device) . map_err ( to_output_err ) ?;
304
308
emit_entries ( engine. clone ( ) , out, & dev. map . entries ) ?;
305
- out. device_e ( ) ?;
309
+ out. device_e ( ) . map_err ( to_output_err ) ?;
306
310
}
307
- out. superblock_e ( ) ?;
308
- out. eof ( ) ?;
311
+ out. superblock_e ( ) . map_err ( to_output_err ) ?;
312
+ out. eof ( ) . map_err ( to_output_err ) ?;
309
313
310
314
Ok ( ( ) )
311
315
}
312
316
313
317
//------------------------------------------
314
318
315
- pub fn dump ( opts : ThinDumpOptions ) -> Result < ( ) > {
316
- let ctx = mk_context ( & opts) ?;
319
+ pub fn dump ( opts : ThinDumpOptions ) -> Result < ( ) , IoError > {
320
+ let ctx = mk_context ( & opts) . map_err ( to_input_err ) ?;
317
321
let sb = if opts. repair {
318
322
read_or_rebuild_superblock (
319
323
ctx. engine . clone ( ) ,
320
324
ctx. report . clone ( ) ,
321
325
SUPERBLOCK_LOCATION ,
322
326
& opts. overrides ,
323
- ) ?
327
+ )
324
328
} else if opts. use_metadata_snap {
325
- read_superblock_snap ( ctx. engine . as_ref ( ) ) ?
329
+ read_superblock_snap ( ctx. engine . as_ref ( ) )
326
330
} else {
327
331
read_superblock ( ctx. engine . as_ref ( ) , SUPERBLOCK_LOCATION )
328
- . and_then ( |sb| sb. overrides ( & opts. overrides ) ) ?
329
- } ;
330
- let md = build_metadata ( ctx. engine . clone ( ) , & sb) ?;
331
- let md = optimise_metadata ( md) ?;
332
+ . and_then ( |sb| sb. overrides ( & opts. overrides ) )
333
+ }
334
+ . map_err ( to_input_err) ?;
335
+
336
+ let md = build_metadata ( ctx. engine . clone ( ) , & sb) . map_err ( to_input_err) ?;
337
+ let md = optimise_metadata ( md) . map_err ( to_input_err) ?;
332
338
333
339
let writer: Box < dyn Write > = if opts. output . is_some ( ) {
334
- Box :: new ( BufWriter :: new ( File :: create ( opts. output . unwrap ( ) ) ?) )
340
+ Box :: new ( BufWriter :: new (
341
+ File :: create ( opts. output . unwrap ( ) ) . map_err ( |e| IoError :: Output ( e. into ( ) ) ) ?,
342
+ ) )
335
343
} else {
336
344
Box :: new ( BufWriter :: new ( std:: io:: stdout ( ) ) )
337
345
} ;
0 commit comments