dmu_traverse.c revision bc9014e6a81272073b9854d9f65dd59e18d18c35
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * CDDL HEADER START
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * The contents of this file are subject to the terms of the
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * Common Development and Distribution License (the "License").
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * You may not use this file except in compliance with the License.
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * or http://www.opensolaris.org/os/licensing.
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * See the License for the specific language governing permissions
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * and limitations under the License.
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * When distributing Covered Code, include this CDDL HEADER in each
d78764efc954da87cd81023cc846a6a5af360d95Robert Wapshott * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * If applicable, add the following below this CDDL HEADER, with the
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * fields enclosed by brackets "[]" replaced with your own identifying
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * information: Portions Copyright [yyyy] [name of copyright owner]
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Madden * CDDL HEADER END
0fb4093da08d574d3d1b661d4425dfbac8e02aabJames Phillpotts * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
0fb4093da08d574d3d1b661d4425dfbac8e02aabJames Phillpotts * Copyright (c) 2012, 2014 by Delphix. All rights reserved.
997d6667b8c483bf582a231b1b24f84fbe6c8390Neil Maddentypedef struct prefetch_data {
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshotttypedef struct traverse_data {
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Maddenstatic int traverse_dnode(traverse_data_t *td, const dnode_phys_t *dnp,
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Maddenstatic void prefetch_dnode_metadata(traverse_data_t *td, const dnode_phys_t *,
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Maddentraverse_zil_block(zilog_t *zilog, blkptr_t *bp, void *arg, uint64_t claim_txg)
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott if (claim_txg == 0 && bp->blk_birth >= spa_first_txg(td->td_spa))
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Madden SET_BOOKMARK(&zb, td->td_objset, ZB_ZIL_OBJECT, ZB_ZIL_LEVEL,
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Madden (void) td->td_func(td->td_spa, zilog, bp, &zb, NULL, td->td_arg);
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshotttraverse_zil_record(zilog_t *zilog, lr_t *lrc, void *arg, uint64_t claim_txg)
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott if (claim_txg == 0 || bp->blk_birth < claim_txg)
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Madden ZB_ZIL_LEVEL, lr->lr_offset / BP_GET_LSIZE(bp));
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Madden (void) td->td_func(td->td_spa, zilog, bp, &zb, NULL,
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Maddentraverse_zil(traverse_data_t *td, zil_header_t *zh)
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * We only want to visit blocks that have been claimed but not yet
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * replayed; plus, in read-only mode, blocks that are already stable.
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Madden if (claim_txg == 0 && spa_writeable(td->td_spa))
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott zilog = zil_alloc(spa_get_dsl(td->td_spa)->dp_meta_objset, zh);
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott (void) zil_parse(zilog, traverse_zil_block, traverse_zil_record, td,
2778561141de5c5f382c2ef5a123adfd90abf466Phill Cunnington * Returns RESUME_SKIP_ALL if td indicates that we are resuming a traversal and
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * the block indicated by zb does not need to be visited at all. Returns
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * RESUME_SKIP_CHILDREN if we are resuming a post traversal and we reach the
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * resume point. This indicates that this block should be visited but not its
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Madden * children (since they must have been visited in a previous traversal).
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Madden * Otherwise returns RESUME_SKIP_NONE.
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Maddenresume_skip_check(traverse_data_t *td, const dnode_phys_t *dnp,
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Madden if (td->td_resume != NULL && !ZB_IS_ZERO(td->td_resume)) {
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Madden * If we already visited this bp & everything below,
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Madden * don't bother doing it again.
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Madden if (zbookmark_is_before(dnp, zb, td->td_resume))
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Madden * If we found the block we're trying to resume from, zero
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott * the bookmark out to indicate that we have resumed.
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott if (bcmp(zb, td->td_resume, sizeof (*zb)) == 0) {
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshotttraverse_prefetch_metadata(traverse_data_t *td,
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Madden arc_flags_t flags = ARC_FLAG_NOWAIT | ARC_FLAG_PREFETCH;
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Madden if (!(td->td_flags & TRAVERSE_PREFETCH_METADATA))
2778561141de5c5f382c2ef5a123adfd90abf466Phill Cunnington * If we are in the process of resuming, don't prefetch, because
2778561141de5c5f382c2ef5a123adfd90abf466Phill Cunnington * some children will not be needed (and in fact may have already
2778561141de5c5f382c2ef5a123adfd90abf466Phill Cunnington * been freed).
2778561141de5c5f382c2ef5a123adfd90abf466Phill Cunnington if (td->td_resume != NULL && !ZB_IS_ZERO(td->td_resume))
2778561141de5c5f382c2ef5a123adfd90abf466Phill Cunnington if (BP_IS_HOLE(bp) || bp->blk_birth <= td->td_min_txg)
8d75f7fba11e555d87ff0f6f2a7504681c482e0bNeil Madden if (BP_GET_LEVEL(bp) == 0 && BP_GET_TYPE(bp) != DMU_OT_DNODE)
997d6667b8c483bf582a231b1b24f84fbe6c8390Neil Madden (void) arc_read(NULL, td->td_spa, bp, NULL, NULL,
d0da70ccbba38b773e7a7cc71bc124b06206d201Robert Wapshott ZIO_PRIORITY_ASYNC_READ, ZIO_FLAG_CANFAIL, &flags, zb);
return (B_FALSE);
return (B_TRUE);
int err = 0;
case RESUME_SKIP_ALL:
case RESUME_SKIP_CHILDREN:
goto post;
case RESUME_SKIP_NONE:
ASSERT(0);
if (err != 0)
goto post;
if (err != 0)
goto post;
if (err != 0)
goto post;
for (i = 0; i < epb; i++) {
for (i = 0; i < epb; i++) {
if (err != 0)
if (err != 0)
goto post;
for (i = 0; i < epb; i++) {
for (i = 0; i < epb; i++) {
if (err != 0)
if (err != 0)
goto post;
if (buf)
post:
err = 0;
return (err);
int j, err = 0;
if (err != 0)
return (err);
int err;
if (err != 0)
return (err);
return (err);
int err;
if (err != 0)
return (err);
if (err != 0) {
if (hard)
if (err != 0) {
if (hard)
if (err != 0)
err = 0;
return (err);