1eda14cbcSMatt Macy /* 2eda14cbcSMatt Macy * CDDL HEADER START 3eda14cbcSMatt Macy * 4eda14cbcSMatt Macy * The contents of this file are subject to the terms of the 5eda14cbcSMatt Macy * Common Development and Distribution License (the "License"). 6eda14cbcSMatt Macy * You may not use this file except in compliance with the License. 7eda14cbcSMatt Macy * 8eda14cbcSMatt Macy * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9eda14cbcSMatt Macy * or http://www.opensolaris.org/os/licensing. 10eda14cbcSMatt Macy * See the License for the specific language governing permissions 11eda14cbcSMatt Macy * and limitations under the License. 12eda14cbcSMatt Macy * 13eda14cbcSMatt Macy * When distributing Covered Code, include this CDDL HEADER in each 14eda14cbcSMatt Macy * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15eda14cbcSMatt Macy * If applicable, add the following below this CDDL HEADER, with the 16eda14cbcSMatt Macy * fields enclosed by brackets "[]" replaced with your own identifying 17eda14cbcSMatt Macy * information: Portions Copyright [yyyy] [name of copyright owner] 18eda14cbcSMatt Macy * 19eda14cbcSMatt Macy * CDDL HEADER END 20eda14cbcSMatt Macy */ 21eda14cbcSMatt Macy /* 22eda14cbcSMatt Macy * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23eda14cbcSMatt Macy * Use is subject to license terms. 24eda14cbcSMatt Macy */ 25eda14cbcSMatt Macy 26eda14cbcSMatt Macy /* 27eda14cbcSMatt Macy * Copyright (c) 2014, 2017 by Delphix. All rights reserved. 28eda14cbcSMatt Macy */ 29eda14cbcSMatt Macy 30eda14cbcSMatt Macy #ifndef _DMU_ZFETCH_H 31eda14cbcSMatt Macy #define _DMU_ZFETCH_H 32eda14cbcSMatt Macy 33eda14cbcSMatt Macy #include <sys/zfs_context.h> 34eda14cbcSMatt Macy 35eda14cbcSMatt Macy #ifdef __cplusplus 36eda14cbcSMatt Macy extern "C" { 37eda14cbcSMatt Macy #endif 38eda14cbcSMatt Macy 39eda14cbcSMatt Macy extern unsigned long zfetch_array_rd_sz; 40eda14cbcSMatt Macy 41eda14cbcSMatt Macy struct dnode; /* so we can reference dnode */ 42eda14cbcSMatt Macy 43*7877fdebSMatt Macy typedef struct zfetch { 44*7877fdebSMatt Macy kmutex_t zf_lock; /* protects zfetch structure */ 45*7877fdebSMatt Macy list_t zf_stream; /* list of zstream_t's */ 46*7877fdebSMatt Macy struct dnode *zf_dnode; /* dnode that owns this zfetch */ 47*7877fdebSMatt Macy int zf_numstreams; /* number of zstream_t's */ 48*7877fdebSMatt Macy } zfetch_t; 49*7877fdebSMatt Macy 50eda14cbcSMatt Macy typedef struct zstream { 51eda14cbcSMatt Macy uint64_t zs_blkid; /* expect next access at this blkid */ 52eda14cbcSMatt Macy uint64_t zs_pf_blkid; /* next block to prefetch */ 53eda14cbcSMatt Macy 54eda14cbcSMatt Macy /* 55eda14cbcSMatt Macy * We will next prefetch the L1 indirect block of this level-0 56eda14cbcSMatt Macy * block id. 57eda14cbcSMatt Macy */ 58eda14cbcSMatt Macy uint64_t zs_ipf_blkid; 59eda14cbcSMatt Macy 60eda14cbcSMatt Macy kmutex_t zs_lock; /* protects stream */ 61eda14cbcSMatt Macy hrtime_t zs_atime; /* time last prefetch issued */ 62*7877fdebSMatt Macy hrtime_t zs_start_time; /* start of last prefetch */ 63eda14cbcSMatt Macy list_node_t zs_node; /* link for zf_stream */ 64*7877fdebSMatt Macy zfetch_t *zs_fetch; /* parent fetch */ 65*7877fdebSMatt Macy zfs_refcount_t zs_blocks; /* number of pending blocks in the stream */ 66eda14cbcSMatt Macy } zstream_t; 67eda14cbcSMatt Macy 68eda14cbcSMatt Macy void zfetch_init(void); 69eda14cbcSMatt Macy void zfetch_fini(void); 70eda14cbcSMatt Macy 71eda14cbcSMatt Macy void dmu_zfetch_init(zfetch_t *, struct dnode *); 72eda14cbcSMatt Macy void dmu_zfetch_fini(zfetch_t *); 73eda14cbcSMatt Macy void dmu_zfetch(zfetch_t *, uint64_t, uint64_t, boolean_t, 74eda14cbcSMatt Macy boolean_t); 75eda14cbcSMatt Macy 76eda14cbcSMatt Macy 77eda14cbcSMatt Macy #ifdef __cplusplus 78eda14cbcSMatt Macy } 79eda14cbcSMatt Macy #endif 80eda14cbcSMatt Macy 81eda14cbcSMatt Macy #endif /* _DMU_ZFETCH_H */ 82