Skip to content

Commit 252e1a5

Browse files
ahrensbehlendorf
authored andcommitted
Illumos 5810 - zdb should print details of bpobj
5810 zdb should print details of bpobj Reviewed by: Prakash Surya <prakash.surya@delphix.com> Reviewed by: Alex Reece <alex@delphix.com> Reviewed by: George Wilson <george@delphix.com> Reviewed by: Will Andrews <will@freebsd.org> Reviewed by: Simon Klinkert <simon.klinkert@gmail.com> Approved by: Gordon Ross <gwr@nexenta.com> References: https://www.illumos.org/issues/5810 illumos/illumos-gate@732885fc Ported-by: DHE <git@dehacked.net> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #3387
1 parent 10400bf commit 252e1a5

File tree

3 files changed

+92
-15
lines changed

3 files changed

+92
-15
lines changed

cmd/zdb/zdb.c

Lines changed: 89 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ int zopt_objects = 0;
9292
libzfs_handle_t *g_zfs;
9393
uint64_t max_inflight = 1000;
9494

95+
static void snprintf_blkptr_compact(char *, size_t, const blkptr_t *);
96+
9597
/*
9698
* These libumem hooks provide a reasonable set of defaults for the allocator's
9799
* debugging facilities.
@@ -413,6 +415,81 @@ dump_zap(objset_t *os, uint64_t object, void *data, size_t size)
413415
zap_cursor_fini(&zc);
414416
}
415417

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+
416493
/*ARGSUSED*/
417494
static void
418495
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)
13841461
}
13851462

13861463
static void
1387-
dump_bpobj(bpobj_t *bpo, char *name, int indent)
1464+
dump_full_bpobj(bpobj_t *bpo, char *name, int indent)
13881465
{
13891466
char bytes[32];
13901467
char comp[32];
@@ -1399,11 +1476,12 @@ dump_bpobj(bpobj_t *bpo, char *name, int indent)
13991476
zdb_nicenum(bpo->bpo_phys->bpo_comp, comp);
14001477
zdb_nicenum(bpo->bpo_phys->bpo_uncomp, uncomp);
14011478
(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",
14031480
indent * 8, name,
14041481
(u_longlong_t)bpo->bpo_object,
14051482
(u_longlong_t)bpo->bpo_phys->bpo_num_blkptrs,
14061483
(u_longlong_t)bpo->bpo_phys->bpo_num_subobjs,
1484+
(u_longlong_t)bpo->bpo_phys->bpo_subobjs,
14071485
bytes, comp, uncomp);
14081486

14091487
for (i = 0; i < bpo->bpo_phys->bpo_num_subobjs; i++) {
@@ -1420,7 +1498,7 @@ dump_bpobj(bpobj_t *bpo, char *name, int indent)
14201498
error, (u_longlong_t)subobj);
14211499
continue;
14221500
}
1423-
dump_bpobj(&subbpo, "subobj", indent + 1);
1501+
dump_full_bpobj(&subbpo, "subobj", indent + 1);
14241502
}
14251503
} else {
14261504
(void) printf(" %*s: object %llu, %llu blkptrs, %s\n",
@@ -1453,7 +1531,7 @@ dump_deadlist(dsl_deadlist_t *dl)
14531531
return;
14541532

14551533
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);
14571535
return;
14581536
}
14591537

@@ -1480,7 +1558,7 @@ dump_deadlist(dsl_deadlist_t *dl)
14801558
(longlong_t)dle->dle_mintxg,
14811559
(longlong_t)dle->dle_bpobj.bpo_object);
14821560

1483-
dump_bpobj(&dle->dle_bpobj, buf, 0);
1561+
dump_full_bpobj(&dle->dle_bpobj, buf, 0);
14841562
} else {
14851563
(void) printf("mintxg %llu -> obj %llu\n",
14861564
(longlong_t)dle->dle_mintxg,
@@ -1728,8 +1806,8 @@ static object_viewer_t *object_viewer[DMU_OT_NUMTYPES + 1] = {
17281806
dump_uint64, /* object array */
17291807
dump_none, /* packed nvlist */
17301808
dump_packed_nvlist, /* packed nvlist size */
1731-
dump_none, /* bplist */
1732-
dump_none, /* bplist header */
1809+
dump_none, /* bpobj */
1810+
dump_bpobj, /* bpobj header */
17331811
dump_none, /* SPA space map header */
17341812
dump_none, /* SPA space map */
17351813
dump_none, /* ZIL intent log */
@@ -1776,7 +1854,7 @@ static object_viewer_t *object_viewer[DMU_OT_NUMTYPES + 1] = {
17761854
dump_zap, /* deadlist */
17771855
dump_none, /* deadlist hdr */
17781856
dump_zap, /* dsl clones */
1779-
dump_none, /* bpobj subobjs */
1857+
dump_bpobj_subobjs, /* bpobj subobjs */
17801858
dump_unknown, /* Unknown type, must be last */
17811859
};
17821860

@@ -2994,10 +3072,11 @@ dump_zpool(spa_t *spa)
29943072
uint64_t refcount;
29953073
dump_dir(dp->dp_meta_objset);
29963074
if (dump_opt['d'] >= 3) {
2997-
dump_bpobj(&spa->spa_deferred_bpobj,
3075+
dump_full_bpobj(&spa->spa_deferred_bpobj,
29983076
"Deferred frees", 0);
29993077
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,
30013080
"Pool snapshot frees", 0);
30023081
}
30033082

include/sys/bpobj.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
*/
2121
/*
2222
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
23-
* Copyright (c) 2012 by Delphix. All rights reserved.
23+
* Copyright (c) 2012, 2014 by Delphix. All rights reserved.
2424
*/
2525

2626
#ifndef _SYS_BPOBJ_H
@@ -77,7 +77,6 @@ void bpobj_close(bpobj_t *bpo);
7777

7878
int bpobj_iterate(bpobj_t *bpo, bpobj_itor_t func, void *arg, dmu_tx_t *tx);
7979
int bpobj_iterate_nofree(bpobj_t *bpo, bpobj_itor_t func, void *, dmu_tx_t *);
80-
int bpobj_iterate_dbg(bpobj_t *bpo, uint64_t *itorp, blkptr_t *bp);
8180

8281
void bpobj_enqueue_subobj(bpobj_t *bpo, uint64_t subobj, dmu_tx_t *tx);
8382
void bpobj_enqueue(bpobj_t *bpo, const blkptr_t *bp, dmu_tx_t *tx);

module/zfs/bpobj.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
*/
2121
/*
2222
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23-
* Copyright (c) 2013 by Delphix. All rights reserved.
23+
* Copyright (c) 2011, 2014 by Delphix. All rights reserved.
2424
*/
2525

2626
#include <sys/bpobj.h>
@@ -256,9 +256,8 @@ bpobj_iterate_impl(bpobj_t *bpo, bpobj_itor_t func, void *arg, dmu_tx_t *tx,
256256
dbuf = NULL;
257257
}
258258
if (free) {
259-
i++;
260259
VERIFY3U(0, ==, dmu_free_range(bpo->bpo_os, bpo->bpo_object,
261-
i * sizeof (blkptr_t), -1ULL, tx));
260+
(i + 1) * sizeof (blkptr_t), -1ULL, tx));
262261
}
263262
if (err || !bpo->bpo_havesubobj || bpo->bpo_phys->bpo_subobjs == 0)
264263
goto out;

0 commit comments

Comments
 (0)