@@ -2590,7 +2590,7 @@ typedef struct status_cbdata {
2590
2590
int cb_name_flags ;
2591
2591
int cb_namewidth ;
2592
2592
boolean_t cb_allpools ;
2593
- boolean_t cb_verbose ;
2593
+ int cb_verbosity ;
2594
2594
boolean_t cb_literal ;
2595
2595
boolean_t cb_explain ;
2596
2596
boolean_t cb_first ;
@@ -3322,7 +3322,7 @@ print_class_vdevs(zpool_handle_t *zhp, status_cbdata_t *cb, nvlist_t *nv,
3322
3322
nvlist_t * * child ;
3323
3323
boolean_t printed = B_FALSE ;
3324
3324
3325
- assert (zhp != NULL || ! cb -> cb_verbose );
3325
+ assert (zhp != NULL || cb -> cb_verbosity == 0 );
3326
3326
3327
3327
if (nvlist_lookup_nvlist_array (nv , ZPOOL_CONFIG_CHILDREN , & child ,
3328
3328
& children ) != 0 )
@@ -9478,7 +9478,7 @@ class_vdevs_nvlist(zpool_handle_t *zhp, status_cbdata_t *cb, nvlist_t *nv,
9478
9478
if (!cb -> cb_flat_vdevs )
9479
9479
class_obj = fnvlist_alloc ();
9480
9480
9481
- assert (zhp != NULL || ! cb -> cb_verbose );
9481
+ assert (zhp != NULL || cb -> cb_verbosity == 0 );
9482
9482
9483
9483
if (nvlist_lookup_nvlist_array (nv , ZPOOL_CONFIG_CHILDREN , & child ,
9484
9484
& children ) != 0 )
@@ -9586,26 +9586,38 @@ static void
9586
9586
errors_nvlist (zpool_handle_t * zhp , status_cbdata_t * cb , nvlist_t * item )
9587
9587
{
9588
9588
uint64_t nerr ;
9589
+ int verbosity = cb -> cb_verbosity ;
9589
9590
nvlist_t * config = zpool_get_config (zhp , NULL );
9590
9591
if (nvlist_lookup_uint64 (config , ZPOOL_CONFIG_ERRCOUNT ,
9591
9592
& nerr ) == 0 ) {
9592
9593
nice_num_str_nvlist (item , ZPOOL_CONFIG_ERRCOUNT , nerr ,
9593
9594
cb -> cb_literal , cb -> cb_json_as_int , ZFS_NICENUM_1024 );
9594
- if (nerr != 0 && cb -> cb_verbose ) {
9595
+ if (nerr != 0 && cb -> cb_verbosity > 0 ) {
9595
9596
nvlist_t * nverrlist = NULL ;
9596
- if (zpool_get_errlog (zhp , & nverrlist ) == 0 ) {
9597
+ if (zpool_get_errlog (zhp , & nverrlist , verbosity ) == 0 ) {
9597
9598
int i = 0 ;
9598
9599
int count = 0 ;
9599
9600
size_t len = MAXPATHLEN * 2 ;
9600
9601
nvpair_t * elem = NULL ;
9602
+ char * * errl = NULL , * pathbuf = NULL ;
9603
+ nvlist_t * * errnvl = NULL ;
9601
9604
9602
9605
for (nvpair_t * pair =
9603
9606
nvlist_next_nvpair (nverrlist , NULL );
9604
9607
pair != NULL ;
9605
9608
pair = nvlist_next_nvpair (nverrlist , pair ))
9606
9609
count ++ ;
9607
- char * * errl = (char * * )malloc (
9608
- count * sizeof (char * ));
9610
+ if (cb -> cb_verbosity < 2 )
9611
+ errl = calloc (count , sizeof (char * ));
9612
+ else {
9613
+ pathbuf = safe_malloc (len );
9614
+ errnvl = calloc (count ,
9615
+ sizeof (nvlist_t * ));
9616
+ }
9617
+ if (errl == NULL && errnvl == NULL ) {
9618
+ perror ("calloc" );
9619
+ exit (1 );
9620
+ }
9609
9621
9610
9622
while ((elem = nvlist_next_nvpair (nverrlist ,
9611
9623
elem )) != NULL ) {
@@ -9618,16 +9630,46 @@ errors_nvlist(zpool_handle_t *zhp, status_cbdata_t *cb, nvlist_t *item)
9618
9630
ZPOOL_ERR_DATASET , & dsobj ) == 0 );
9619
9631
verify (nvlist_lookup_uint64 (nv ,
9620
9632
ZPOOL_ERR_OBJECT , & obj ) == 0 );
9621
- errl [i ] = safe_malloc (len );
9622
- zpool_obj_to_path (zhp , dsobj , obj ,
9623
- errl [i ++ ], len );
9633
+ if (cb -> cb_verbosity < 2 ) {
9634
+ errl [i ] = safe_malloc (len );
9635
+ zpool_obj_to_path (zhp , dsobj ,
9636
+ obj , errl [i ++ ], len );
9637
+ } else {
9638
+ uint64_t lvl , blkid ;
9639
+
9640
+ errnvl [i ] = fnvlist_alloc ();
9641
+ lvl = fnvlist_lookup_uint64 (nv ,
9642
+ ZPOOL_ERR_LEVEL );
9643
+ blkid = fnvlist_lookup_uint64 (
9644
+ nv , ZPOOL_ERR_BLKID );
9645
+ zpool_obj_to_path (zhp , dsobj ,
9646
+ obj , pathbuf , len );
9647
+ fnvlist_add_string (errnvl [i ],
9648
+ "path" , pathbuf );
9649
+ fnvlist_add_uint64 (errnvl [i ],
9650
+ "level" , lvl );
9651
+ fnvlist_add_uint64 (errnvl [i ++ ],
9652
+ "record" , blkid );
9653
+ }
9624
9654
}
9625
9655
nvlist_free (nverrlist );
9626
- fnvlist_add_string_array (item , "errlist" ,
9627
- (const char * * )errl , count );
9628
- for (int i = 0 ; i < count ; ++ i )
9629
- free (errl [i ]);
9630
- free (errl );
9656
+ if (cb -> cb_verbosity < 2 ) {
9657
+ fnvlist_add_string_array (item ,
9658
+ "errlist" , (const char * * )errl ,
9659
+ count );
9660
+ for (int i = 0 ; i < count ; ++ i )
9661
+ free (errl [i ]);
9662
+ free (errl );
9663
+ } else {
9664
+ fnvlist_add_nvlist_array (item ,
9665
+ "errlist" ,
9666
+ (const nvlist_t * * )errnvl ,
9667
+ count );
9668
+ for (int i = 0 ; i < count ; ++ i )
9669
+ free (errnvl [i ]);
9670
+ free (errnvl );
9671
+ free (pathbuf );
9672
+ }
9631
9673
} else
9632
9674
fnvlist_add_string (item , "errlist" ,
9633
9675
strerror (errno ));
@@ -10304,14 +10346,14 @@ print_checkpoint_status(pool_checkpoint_stat_t *pcs)
10304
10346
}
10305
10347
10306
10348
static void
10307
- print_error_log (zpool_handle_t * zhp )
10349
+ print_error_log (zpool_handle_t * zhp , int verbosity )
10308
10350
{
10309
10351
nvlist_t * nverrlist = NULL ;
10310
10352
nvpair_t * elem ;
10311
10353
char * pathname ;
10312
10354
size_t len = MAXPATHLEN * 2 ;
10313
10355
10314
- if (zpool_get_errlog (zhp , & nverrlist ) != 0 )
10356
+ if (zpool_get_errlog (zhp , & nverrlist , verbosity ) != 0 )
10315
10357
return ;
10316
10358
10317
10359
(void ) printf ("errors: Permanent errors have been "
@@ -10329,7 +10371,16 @@ print_error_log(zpool_handle_t *zhp)
10329
10371
verify (nvlist_lookup_uint64 (nv , ZPOOL_ERR_OBJECT ,
10330
10372
& obj ) == 0 );
10331
10373
zpool_obj_to_path (zhp , dsobj , obj , pathname , len );
10332
- (void ) printf ("%7s %s\n" , "" , pathname );
10374
+ if (verbosity > 1 ) {
10375
+ uint64_t level , blkid ;
10376
+
10377
+ blkid = fnvlist_lookup_uint64 (nv , ZPOOL_ERR_BLKID );
10378
+ level = fnvlist_lookup_uint64 (nv , ZPOOL_ERR_LEVEL );
10379
+ (void ) printf ("%7s %s L%lu record %lu\n" , "" , pathname ,
10380
+ level , blkid );
10381
+ } else {
10382
+ (void ) printf ("%7s %s\n" , "" , pathname );
10383
+ }
10333
10384
}
10334
10385
free (pathname );
10335
10386
nvlist_free (nverrlist );
@@ -11027,14 +11078,14 @@ status_callback(zpool_handle_t *zhp, void *data)
11027
11078
if (nerr == 0 ) {
11028
11079
(void ) printf (gettext (
11029
11080
"errors: No known data errors\n" ));
11030
- } else if (! cbp -> cb_verbose ) {
11081
+ } else if (0 == cbp -> cb_verbosity ) {
11031
11082
color_start (ANSI_RED );
11032
11083
(void ) printf (gettext ("errors: %llu data "
11033
11084
"errors, use '-v' for a list\n" ),
11034
11085
(u_longlong_t )nerr );
11035
11086
color_end ();
11036
11087
} else {
11037
- print_error_log (zhp );
11088
+ print_error_log (zhp , cbp -> cb_verbosity );
11038
11089
}
11039
11090
}
11040
11091
@@ -11161,7 +11212,7 @@ zpool_do_status(int argc, char **argv)
11161
11212
get_timestamp_arg (* optarg );
11162
11213
break ;
11163
11214
case 'v' :
11164
- cb .cb_verbose = B_TRUE ;
11215
+ cb .cb_verbosity ++ ;
11165
11216
break ;
11166
11217
case 'j' :
11167
11218
cb .cb_json = B_TRUE ;
0 commit comments