usr/src/uts/common/fs/zfs/dmu_traverse.c
author Matthew Ahrens <Matthew.Ahrens@Sun.COM>
Tue, 10 Feb 2009 13:01:10 -0800
changeset 8746 e1d96ca6808c
parent 8241 5a60f16123ba
child 9396 f41cf682d0d3
permissions -rw-r--r--
6796377 panic on rollback in space_map_add()
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     1
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     2
 * CDDL HEADER START
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     3
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
     5
 * Common Development and Distribution License (the "License").
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
     6
 * You may not use this file except in compliance with the License.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     7
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    11
 * and limitations under the License.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    12
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    18
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    19
 * CDDL HEADER END
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    20
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    21
/*
8746
e1d96ca6808c 6796377 panic on rollback in space_map_add()
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 8241
diff changeset
    22
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    23
 * Use is subject to license terms.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    24
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
#include <sys/zfs_context.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
#include <sys/dmu_objset.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
#include <sys/dmu_traverse.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    29
#include <sys/dsl_dataset.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
#include <sys/dsl_dir.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
#include <sys/dsl_pool.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
#include <sys/dnode.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
#include <sys/spa.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    34
#include <sys/zio.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
#include <sys/dmu_impl.h>
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    36
#include <sys/callb.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    38
#define	SET_BOOKMARK(zb, objset, object, level, blkid)  \
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    39
{                                                       \
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    40
	(zb)->zb_objset = objset;                       \
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    41
	(zb)->zb_object = object;                       \
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    42
	(zb)->zb_level = level;                         \
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    43
	(zb)->zb_blkid = blkid;                         \
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    45
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    46
struct prefetch_data {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    47
	kmutex_t pd_mtx;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    48
	kcondvar_t pd_cv;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    49
	int pd_blks_max;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    50
	int pd_blks_fetched;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    51
	int pd_flags;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    52
	boolean_t pd_cancel;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    53
	boolean_t pd_exited;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    54
};
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    55
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    56
struct traverse_data {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    57
	spa_t *td_spa;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    58
	uint64_t td_objset;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    59
	blkptr_t *td_rootbp;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    60
	uint64_t td_min_txg;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    61
	int td_flags;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    62
	struct prefetch_data *td_pfd;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    63
	blkptr_cb_t *td_func;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    64
	void *td_arg;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    65
};
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    66
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
    67
/* ARGSUSED */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
    68
static void
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1544
diff changeset
    69
traverse_zil_block(zilog_t *zilog, blkptr_t *bp, void *arg, uint64_t claim_txg)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
    70
{
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    71
	struct traverse_data *td = arg;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    72
	zbookmark_t zb;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
    73
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    74
	if (bp->blk_birth == 0)
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1544
diff changeset
    75
		return;
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1544
diff changeset
    76
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    77
	if (claim_txg == 0 && bp->blk_birth >= spa_first_txg(td->td_spa))
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    78
		return;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    79
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    80
	zb.zb_objset = td->td_objset;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    81
	zb.zb_object = 0;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    82
	zb.zb_level = -1;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    83
	zb.zb_blkid = bp->blk_cksum.zc_word[ZIL_ZC_SEQ];
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    84
	VERIFY(0 == td->td_func(td->td_spa, bp, &zb, NULL, td->td_arg));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
    85
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
    86
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
    87
/* ARGSUSED */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
    88
static void
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1544
diff changeset
    89
traverse_zil_record(zilog_t *zilog, lr_t *lrc, void *arg, uint64_t claim_txg)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
    90
{
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    91
	struct traverse_data *td = arg;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
    92
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
    93
	if (lrc->lrc_txtype == TX_WRITE) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
    94
		lr_write_t *lr = (lr_write_t *)lrc;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
    95
		blkptr_t *bp = &lr->lr_blkptr;
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    96
		zbookmark_t zb;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
    97
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
    98
		if (bp->blk_birth == 0)
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1544
diff changeset
    99
			return;
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1544
diff changeset
   100
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   101
		if (claim_txg == 0 || bp->blk_birth < claim_txg)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   102
			return;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   103
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   104
		zb.zb_objset = td->td_objset;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   105
		zb.zb_object = lr->lr_foid;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   106
		zb.zb_level = BP_GET_LEVEL(bp);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   107
		zb.zb_blkid = lr->lr_offset / BP_GET_LSIZE(bp);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   108
		VERIFY(0 == td->td_func(td->td_spa, bp, &zb, NULL, td->td_arg));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
   109
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
   110
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
   111
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
   112
static void
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   113
traverse_zil(struct traverse_data *td, zil_header_t *zh)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
   114
{
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1544
diff changeset
   115
	uint64_t claim_txg = zh->zh_claim_txg;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
   116
	zilog_t *zilog;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
   117
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1544
diff changeset
   118
	/*
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1544
diff changeset
   119
	 * We only want to visit blocks that have been claimed but not yet
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1544
diff changeset
   120
	 * replayed (or, in read-only mode, blocks that *would* be claimed).
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1544
diff changeset
   121
	 */
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8012
diff changeset
   122
	if (claim_txg == 0 && spa_writeable(td->td_spa))
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1544
diff changeset
   123
		return;
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1544
diff changeset
   124
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   125
	zilog = zil_alloc(spa_get_dsl(td->td_spa)->dp_meta_objset, zh);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
   126
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   127
	(void) zil_parse(zilog, traverse_zil_block, traverse_zil_record, td,
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1544
diff changeset
   128
	    claim_txg);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
   129
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
   130
	zil_free(zilog);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
   131
}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 928
diff changeset
   132
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   133
static int
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   134
traverse_visitbp(struct traverse_data *td, const dnode_phys_t *dnp,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   135
    arc_buf_t *pbuf, blkptr_t *bp, const zbookmark_t *zb)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   136
{
8012
8ea30813950f 6765626 zfs send takes up too much stack space
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 7837
diff changeset
   137
	zbookmark_t czb;
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   138
	int err = 0;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   139
	arc_buf_t *buf = NULL;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   140
	struct prefetch_data *pd = td->td_pfd;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   141
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   142
	if (bp->blk_birth == 0) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   143
		err = td->td_func(td->td_spa, NULL, zb, dnp, td->td_arg);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   144
		return (err);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   145
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   146
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   147
	if (bp->blk_birth <= td->td_min_txg)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   148
		return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   149
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   150
	if (pd && !pd->pd_exited &&
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   151
	    ((pd->pd_flags & TRAVERSE_PREFETCH_DATA) ||
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   152
	    BP_GET_TYPE(bp) == DMU_OT_DNODE || BP_GET_LEVEL(bp) > 0)) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   153
		mutex_enter(&pd->pd_mtx);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   154
		ASSERT(pd->pd_blks_fetched >= 0);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   155
		while (pd->pd_blks_fetched == 0 && !pd->pd_exited)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   156
			cv_wait(&pd->pd_cv, &pd->pd_mtx);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   157
		pd->pd_blks_fetched--;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   158
		cv_broadcast(&pd->pd_cv);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   159
		mutex_exit(&pd->pd_mtx);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   160
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   161
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   162
	if (td->td_flags & TRAVERSE_PRE) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   163
		err = td->td_func(td->td_spa, bp, zb, dnp, td->td_arg);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   164
		if (err)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   165
			return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   166
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   167
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   168
	if (BP_GET_LEVEL(bp) > 0) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   169
		uint32_t flags = ARC_WAIT;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   170
		int i;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   171
		blkptr_t *cbp;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   172
		int epb = BP_GET_LSIZE(bp) >> SPA_BLKPTRSHIFT;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   173
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   174
		err = arc_read(NULL, td->td_spa, bp, pbuf,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   175
		    arc_getbuf_func, &buf,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   176
		    ZIO_PRIORITY_ASYNC_READ, ZIO_FLAG_CANFAIL, &flags, zb);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   177
		if (err)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   178
			return (err);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   179
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   180
		/* recursively visitbp() blocks below this */
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   181
		cbp = buf->b_data;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   182
		for (i = 0; i < epb; i++, cbp++) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   183
			SET_BOOKMARK(&czb, zb->zb_objset, zb->zb_object,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   184
			    zb->zb_level - 1,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   185
			    zb->zb_blkid * epb + i);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   186
			err = traverse_visitbp(td, dnp, buf, cbp, &czb);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   187
			if (err)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   188
				break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   189
		}
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   190
	} else if (BP_GET_TYPE(bp) == DMU_OT_DNODE) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   191
		uint32_t flags = ARC_WAIT;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   192
		int i, j;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   193
		int epb = BP_GET_LSIZE(bp) >> DNODE_SHIFT;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   194
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   195
		err = arc_read(NULL, td->td_spa, bp, pbuf,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   196
		    arc_getbuf_func, &buf,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   197
		    ZIO_PRIORITY_ASYNC_READ, ZIO_FLAG_CANFAIL, &flags, zb);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   198
		if (err)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   199
			return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   200
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   201
		/* recursively visitbp() blocks below this */
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   202
		dnp = buf->b_data;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   203
		for (i = 0; i < epb && err == 0; i++, dnp++) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   204
			for (j = 0; j < dnp->dn_nblkptr; j++) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   205
				SET_BOOKMARK(&czb, zb->zb_objset,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   206
				    zb->zb_blkid * epb + i,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   207
				    dnp->dn_nlevels - 1, j);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   208
				err = traverse_visitbp(td, dnp, buf,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   209
				    (blkptr_t *)&dnp->dn_blkptr[j], &czb);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   210
				if (err)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   211
					break;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   212
			}
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   213
		}
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   214
	} else if (BP_GET_TYPE(bp) == DMU_OT_OBJSET) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   215
		uint32_t flags = ARC_WAIT;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   216
		objset_phys_t *osp;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   217
		int j;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   218
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   219
		err = arc_read_nolock(NULL, td->td_spa, bp,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   220
		    arc_getbuf_func, &buf,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   221
		    ZIO_PRIORITY_ASYNC_READ, ZIO_FLAG_CANFAIL, &flags, zb);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   222
		if (err)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   223
			return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   224
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   225
		osp = buf->b_data;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   226
		traverse_zil(td, &osp->os_zil_header);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   227
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   228
		for (j = 0; j < osp->os_meta_dnode.dn_nblkptr; j++) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   229
			SET_BOOKMARK(&czb, zb->zb_objset, 0,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   230
			    osp->os_meta_dnode.dn_nlevels - 1, j);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   231
			err = traverse_visitbp(td, &osp->os_meta_dnode, buf,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   232
			    (blkptr_t *)&osp->os_meta_dnode.dn_blkptr[j],
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   233
			    &czb);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   234
			if (err)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   235
				break;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   236
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   237
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   238
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   239
	if (buf)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   240
		(void) arc_buf_remove_ref(buf, &buf);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   241
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   242
	if (err == 0 && (td->td_flags & TRAVERSE_POST))
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   243
		err = td->td_func(td->td_spa, bp, zb, dnp, td->td_arg);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   244
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   245
	return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   246
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   247
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   248
/* ARGSUSED */
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   249
static int
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   250
traverse_prefetcher(spa_t *spa, blkptr_t *bp, const zbookmark_t *zb,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   251
    const dnode_phys_t *dnp, void *arg)
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 1807
diff changeset
   252
{
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   253
	struct prefetch_data *pfd = arg;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   254
	uint32_t aflags = ARC_NOWAIT | ARC_PREFETCH;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   255
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   256
	ASSERT(pfd->pd_blks_fetched >= 0);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   257
	if (pfd->pd_cancel)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   258
		return (EINTR);
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 1807
diff changeset
   259
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   260
	if (bp == NULL || !((pfd->pd_flags & TRAVERSE_PREFETCH_DATA) ||
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   261
	    BP_GET_TYPE(bp) == DMU_OT_DNODE || BP_GET_LEVEL(bp) > 0))
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   262
		return (0);
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 1807
diff changeset
   263
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   264
	mutex_enter(&pfd->pd_mtx);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   265
	while (!pfd->pd_cancel && pfd->pd_blks_fetched >= pfd->pd_blks_max)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   266
		cv_wait(&pfd->pd_cv, &pfd->pd_mtx);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   267
	pfd->pd_blks_fetched++;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   268
	cv_broadcast(&pfd->pd_cv);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   269
	mutex_exit(&pfd->pd_mtx);
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 1807
diff changeset
   270
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   271
	(void) arc_read_nolock(NULL, spa, bp, NULL, NULL,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   272
	    ZIO_PRIORITY_ASYNC_READ,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   273
	    ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   274
	    &aflags, zb);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   275
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   276
	return (0);
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 1807
diff changeset
   277
}
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 1807
diff changeset
   278
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   279
static void
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   280
traverse_prefetch_thread(void *arg)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   281
{
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   282
	struct traverse_data *td_main = arg;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   283
	struct traverse_data td = *td_main;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   284
	zbookmark_t czb;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   285
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   286
	td.td_func = traverse_prefetcher;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   287
	td.td_arg = td_main->td_pfd;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   288
	td.td_pfd = NULL;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   289
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   290
	SET_BOOKMARK(&czb, td.td_objset, 0, -1, 0);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   291
	(void) traverse_visitbp(&td, NULL, NULL, td.td_rootbp, &czb);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   292
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   293
	mutex_enter(&td_main->td_pfd->pd_mtx);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   294
	td_main->td_pfd->pd_exited = B_TRUE;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   295
	cv_broadcast(&td_main->td_pfd->pd_cv);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   296
	mutex_exit(&td_main->td_pfd->pd_mtx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   297
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   298
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   299
/*
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   300
 * NB: dataset must not be changing on-disk (eg, is a snapshot or we are
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   301
 * in syncing context).
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   302
 */
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   303
static int
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   304
traverse_impl(spa_t *spa, uint64_t objset, blkptr_t *rootbp,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   305
    uint64_t txg_start, int flags, blkptr_cb_t func, void *arg)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   306
{
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   307
	struct traverse_data td;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   308
	struct prefetch_data pd = { 0 };
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   309
	zbookmark_t czb;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   310
	int err;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   311
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   312
	td.td_spa = spa;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   313
	td.td_objset = objset;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   314
	td.td_rootbp = rootbp;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   315
	td.td_min_txg = txg_start;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   316
	td.td_func = func;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   317
	td.td_arg = arg;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   318
	td.td_pfd = &pd;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   319
	td.td_flags = flags;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   320
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   321
	pd.pd_blks_max = 100;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   322
	pd.pd_flags = flags;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   323
	mutex_init(&pd.pd_mtx, NULL, MUTEX_DEFAULT, NULL);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   324
	cv_init(&pd.pd_cv, NULL, CV_DEFAULT, NULL);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   325
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   326
	if (!(flags & TRAVERSE_PREFETCH) ||
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   327
	    0 == taskq_dispatch(system_taskq, traverse_prefetch_thread,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   328
	    &td, TQ_NOQUEUE))
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   329
		pd.pd_exited = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   330
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   331
	SET_BOOKMARK(&czb, objset, 0, -1, 0);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   332
	err = traverse_visitbp(&td, NULL, NULL, rootbp, &czb);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   333
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   334
	mutex_enter(&pd.pd_mtx);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   335
	pd.pd_cancel = B_TRUE;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   336
	cv_broadcast(&pd.pd_cv);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   337
	while (!pd.pd_exited)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   338
		cv_wait(&pd.pd_cv, &pd.pd_mtx);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   339
	mutex_exit(&pd.pd_mtx);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   340
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   341
	mutex_destroy(&pd.pd_mtx);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   342
	cv_destroy(&pd.pd_cv);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   343
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   344
	return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   345
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   346
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   347
/*
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   348
 * NB: dataset must not be changing on-disk (eg, is a snapshot or we are
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   349
 * in syncing context).
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   350
 */
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   351
int
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   352
traverse_dataset(dsl_dataset_t *ds, uint64_t txg_start, int flags,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   353
    blkptr_cb_t func, void *arg)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   354
{
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   355
	return (traverse_impl(ds->ds_dir->dd_pool->dp_spa, ds->ds_object,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   356
	    &ds->ds_phys->ds_bp, txg_start, flags, func, arg));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   357
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   358
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   359
/*
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   360
 * NB: pool must not be changing on-disk (eg, from zdb or sync context).
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   361
 */
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   362
int
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   363
traverse_pool(spa_t *spa, blkptr_cb_t func, void *arg)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   364
{
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   365
	int err;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   366
	uint64_t obj;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   367
	dsl_pool_t *dp = spa_get_dsl(spa);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   368
	objset_t *mos = dp->dp_meta_objset;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   369
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   370
	/* visit the MOS */
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   371
	err = traverse_impl(spa, 0, spa_get_rootblkptr(spa),
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   372
	    0, TRAVERSE_PRE, func, arg);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   373
	if (err)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   374
		return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   375
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   376
	/* visit each dataset */
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   377
	for (obj = 1; err == 0; err = dmu_object_next(mos, &obj, FALSE, 0)) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   378
		dmu_object_info_t doi;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   379
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   380
		err = dmu_object_info(mos, obj, &doi);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   381
		if (err)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   382
			return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   383
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   384
		if (doi.doi_type == DMU_OT_DSL_DATASET) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   385
			dsl_dataset_t *ds;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   386
			rw_enter(&dp->dp_config_rwlock, RW_READER);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   387
			err = dsl_dataset_hold_obj(dp, obj, FTAG, &ds);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   388
			rw_exit(&dp->dp_config_rwlock);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   389
			if (err)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   390
				return (err);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   391
			err = traverse_dataset(ds,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   392
			    ds->ds_phys->ds_prev_snap_txg, TRAVERSE_PRE,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   393
			    func, arg);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   394
			dsl_dataset_rele(ds, FTAG);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   395
			if (err)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   396
				return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   397
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   398
	}
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   399
	if (err == ESRCH)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   400
		err = 0;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7046
diff changeset
   401
	return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   402
}