@@ -92,6 +92,8 @@ int zopt_objects = 0;
92
92
libzfs_handle_t * g_zfs ;
93
93
uint64_t max_inflight = 1000 ;
94
94
95
+ static void snprintf_blkptr_compact (char * , size_t , const blkptr_t * );
96
+
95
97
/*
96
98
* These libumem hooks provide a reasonable set of defaults for the allocator's
97
99
* debugging facilities.
@@ -413,6 +415,81 @@ dump_zap(objset_t *os, uint64_t object, void *data, size_t size)
413
415
zap_cursor_fini (& zc );
414
416
}
415
417
418
+ static void
419
+ dump_bpobj (objset_t * os , uint64_t object , void * data , size_t size )
420
+ {
421
+ bpobj_phys_t * bpop = data ;
422
+ uint64_t i ;
423
+ char bytes [32 ], comp [32 ], uncomp [32 ];
424
+
425
+ if (bpop == NULL )
426
+ return ;
427
+
428
+ zdb_nicenum (bpop -> bpo_bytes , bytes );
429
+ zdb_nicenum (bpop -> bpo_comp , comp );
430
+ zdb_nicenum (bpop -> bpo_uncomp , uncomp );
431
+
432
+ (void ) printf ("\t\tnum_blkptrs = %llu\n" ,
433
+ (u_longlong_t )bpop -> bpo_num_blkptrs );
434
+ (void ) printf ("\t\tbytes = %s\n" , bytes );
435
+ if (size >= BPOBJ_SIZE_V1 ) {
436
+ (void ) printf ("\t\tcomp = %s\n" , comp );
437
+ (void ) printf ("\t\tuncomp = %s\n" , uncomp );
438
+ }
439
+ if (size >= sizeof (* bpop )) {
440
+ (void ) printf ("\t\tsubobjs = %llu\n" ,
441
+ (u_longlong_t )bpop -> bpo_subobjs );
442
+ (void ) printf ("\t\tnum_subobjs = %llu\n" ,
443
+ (u_longlong_t )bpop -> bpo_num_subobjs );
444
+ }
445
+
446
+ if (dump_opt ['d' ] < 5 )
447
+ return ;
448
+
449
+ for (i = 0 ; i < bpop -> bpo_num_blkptrs ; i ++ ) {
450
+ char blkbuf [BP_SPRINTF_LEN ];
451
+ blkptr_t bp ;
452
+
453
+ int err = dmu_read (os , object ,
454
+ i * sizeof (bp ), sizeof (bp ), & bp , 0 );
455
+ if (err != 0 ) {
456
+ (void ) printf ("got error %u from dmu_read\n" , err );
457
+ break ;
458
+ }
459
+ snprintf_blkptr_compact (blkbuf , sizeof (blkbuf ), & bp );
460
+ (void ) printf ("\t%s\n" , blkbuf );
461
+ }
462
+ }
463
+
464
+ /* ARGSUSED */
465
+ static void
466
+ dump_bpobj_subobjs (objset_t * os , uint64_t object , void * data , size_t size )
467
+ {
468
+ dmu_object_info_t doi ;
469
+ uint64_t i ;
470
+
471
+ VERIFY0 (dmu_object_info (os , object , & doi ));
472
+ uint64_t * subobjs = kmem_alloc (doi .doi_max_offset , KM_SLEEP );
473
+
474
+ int err = dmu_read (os , object , 0 , doi .doi_max_offset , subobjs , 0 );
475
+ if (err != 0 ) {
476
+ (void ) printf ("got error %u from dmu_read\n" , err );
477
+ kmem_free (subobjs , doi .doi_max_offset );
478
+ return ;
479
+ }
480
+
481
+ int64_t last_nonzero = -1 ;
482
+ for (i = 0 ; i < doi .doi_max_offset / 8 ; i ++ ) {
483
+ if (subobjs [i ] != 0 )
484
+ last_nonzero = i ;
485
+ }
486
+
487
+ for (i = 0 ; i <= last_nonzero ; i ++ ) {
488
+ (void ) printf ("\t%llu\n" , (longlong_t )subobjs [i ]);
489
+ }
490
+ kmem_free (subobjs , doi .doi_max_offset );
491
+ }
492
+
416
493
/*ARGSUSED*/
417
494
static void
418
495
dump_ddt_zap (objset_t * os , uint64_t object , void * data , size_t size )
@@ -1384,7 +1461,7 @@ dump_bpobj_cb(void *arg, const blkptr_t *bp, dmu_tx_t *tx)
1384
1461
}
1385
1462
1386
1463
static void
1387
- dump_bpobj (bpobj_t * bpo , char * name , int indent )
1464
+ dump_full_bpobj (bpobj_t * bpo , char * name , int indent )
1388
1465
{
1389
1466
char bytes [32 ];
1390
1467
char comp [32 ];
@@ -1399,11 +1476,12 @@ dump_bpobj(bpobj_t *bpo, char *name, int indent)
1399
1476
zdb_nicenum (bpo -> bpo_phys -> bpo_comp , comp );
1400
1477
zdb_nicenum (bpo -> bpo_phys -> bpo_uncomp , uncomp );
1401
1478
(void ) printf (" %*s: object %llu, %llu local blkptrs, "
1402
- "%llu subobjs, %s (%s/%s comp)\n" ,
1479
+ "%llu subobjs in object, %llu , %s (%s/%s comp)\n" ,
1403
1480
indent * 8 , name ,
1404
1481
(u_longlong_t )bpo -> bpo_object ,
1405
1482
(u_longlong_t )bpo -> bpo_phys -> bpo_num_blkptrs ,
1406
1483
(u_longlong_t )bpo -> bpo_phys -> bpo_num_subobjs ,
1484
+ (u_longlong_t )bpo -> bpo_phys -> bpo_subobjs ,
1407
1485
bytes , comp , uncomp );
1408
1486
1409
1487
for (i = 0 ; i < bpo -> bpo_phys -> bpo_num_subobjs ; i ++ ) {
@@ -1420,7 +1498,7 @@ dump_bpobj(bpobj_t *bpo, char *name, int indent)
1420
1498
error , (u_longlong_t )subobj );
1421
1499
continue ;
1422
1500
}
1423
- dump_bpobj (& subbpo , "subobj" , indent + 1 );
1501
+ dump_full_bpobj (& subbpo , "subobj" , indent + 1 );
1424
1502
}
1425
1503
} else {
1426
1504
(void ) printf (" %*s: object %llu, %llu blkptrs, %s\n" ,
@@ -1453,7 +1531,7 @@ dump_deadlist(dsl_deadlist_t *dl)
1453
1531
return ;
1454
1532
1455
1533
if (dl -> dl_oldfmt ) {
1456
- dump_bpobj (& dl -> dl_bpobj , "old-format deadlist" , 0 );
1534
+ dump_full_bpobj (& dl -> dl_bpobj , "old-format deadlist" , 0 );
1457
1535
return ;
1458
1536
}
1459
1537
@@ -1480,7 +1558,7 @@ dump_deadlist(dsl_deadlist_t *dl)
1480
1558
(longlong_t )dle -> dle_mintxg ,
1481
1559
(longlong_t )dle -> dle_bpobj .bpo_object );
1482
1560
1483
- dump_bpobj (& dle -> dle_bpobj , buf , 0 );
1561
+ dump_full_bpobj (& dle -> dle_bpobj , buf , 0 );
1484
1562
} else {
1485
1563
(void ) printf ("mintxg %llu -> obj %llu\n" ,
1486
1564
(longlong_t )dle -> dle_mintxg ,
@@ -1728,8 +1806,8 @@ static object_viewer_t *object_viewer[DMU_OT_NUMTYPES + 1] = {
1728
1806
dump_uint64 , /* object array */
1729
1807
dump_none , /* packed nvlist */
1730
1808
dump_packed_nvlist , /* packed nvlist size */
1731
- dump_none , /* bplist */
1732
- dump_none , /* bplist header */
1809
+ dump_none , /* bpobj */
1810
+ dump_bpobj , /* bpobj header */
1733
1811
dump_none , /* SPA space map header */
1734
1812
dump_none , /* SPA space map */
1735
1813
dump_none , /* ZIL intent log */
@@ -1776,7 +1854,7 @@ static object_viewer_t *object_viewer[DMU_OT_NUMTYPES + 1] = {
1776
1854
dump_zap , /* deadlist */
1777
1855
dump_none , /* deadlist hdr */
1778
1856
dump_zap , /* dsl clones */
1779
- dump_none , /* bpobj subobjs */
1857
+ dump_bpobj_subobjs , /* bpobj subobjs */
1780
1858
dump_unknown , /* Unknown type, must be last */
1781
1859
};
1782
1860
@@ -2994,10 +3072,11 @@ dump_zpool(spa_t *spa)
2994
3072
uint64_t refcount ;
2995
3073
dump_dir (dp -> dp_meta_objset );
2996
3074
if (dump_opt ['d' ] >= 3 ) {
2997
- dump_bpobj (& spa -> spa_deferred_bpobj ,
3075
+ dump_full_bpobj (& spa -> spa_deferred_bpobj ,
2998
3076
"Deferred frees" , 0 );
2999
3077
if (spa_version (spa ) >= SPA_VERSION_DEADLISTS ) {
3000
- dump_bpobj (& spa -> spa_dsl_pool -> dp_free_bpobj ,
3078
+ dump_full_bpobj (
3079
+ & spa -> spa_dsl_pool -> dp_free_bpobj ,
3001
3080
"Pool snapshot frees" , 0 );
3002
3081
}
3003
3082
0 commit comments