fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The contents of this file are subject to the terms of the
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Common Development and Distribution License (the "License").
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * You may not use this file except in compliance with the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * or http://www.opensolaris.org/os/licensing.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * When distributing Covered Code, include this CDDL HEADER in each
fa9e4066f08beec538e775443c5be79dd423fcabahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If applicable, add the following below this CDDL HEADER, with the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fields enclosed by brackets "[]" replaced with your own identifying
fa9e4066f08beec538e775443c5be79dd423fcabahrens * information: Portions Copyright [yyyy] [name of copyright owner]
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER END
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
46e1baa6cf6d5432f5fd231bb588df8f9570c858Matthew Ahrens * Copyright (c) 2012, 2015 by Delphix. All rights reserved.
aad02571bc59671aa3103bb070ae365f531b0b62Saso Kiselkov * Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
bc9014e6a81272073b9854d9f65dd59e18d18c35Justin Gibbs * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifndef _SYS_DBUF_H
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define _SYS_DBUF_H
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/dmu.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/spa.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/txg.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/zio.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/arc.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/zfs_context.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/refcount.h>
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson#include <sys/zrlock.h>
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson#include <sys/multilist.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef __cplusplus
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern "C" {
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee#define IN_DMU_SYNC 2
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * define flags for dbuf_read
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
13506d1eefbbc37e2f12a0528831d9f6d4c361d7maybee#define DB_RF_MUST_SUCCEED (1 << 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define DB_RF_CANFAIL (1 << 1)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define DB_RF_HAVESTRUCT (1 << 2)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define DB_RF_NOPREFETCH (1 << 3)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock#define DB_RF_NEVERWAIT (1 << 4)
13506d1eefbbc37e2f12a0528831d9f6d4c361d7maybee#define DB_RF_CACHED (1 << 5)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
82c9918f28a2d8d9e93769e16f7fa7bee347e80fTim Haley * The simplified state transition diagram for dbufs looks like:
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * +----> READ ----+
fa9e4066f08beec538e775443c5be79dd423fcabahrens * | |
fa9e4066f08beec538e775443c5be79dd423fcabahrens * | V
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * (alloc)-->UNCACHED CACHED-->EVICTING-->(free)
82c9918f28a2d8d9e93769e16f7fa7bee347e80fTim Haley * | ^ ^
82c9918f28a2d8d9e93769e16f7fa7bee347e80fTim Haley * | | |
82c9918f28a2d8d9e93769e16f7fa7bee347e80fTim Haley * +----> FILL ----+ |
82c9918f28a2d8d9e93769e16f7fa7bee347e80fTim Haley * | |
82c9918f28a2d8d9e93769e16f7fa7bee347e80fTim Haley * | |
82c9918f28a2d8d9e93769e16f7fa7bee347e80fTim Haley * +--------> NOFILL -------+
86bb58aec7165f8a0303564575c65e5a2ad58bf1Alex Reece *
86bb58aec7165f8a0303564575c65e5a2ad58bf1Alex Reece * DB_SEARCH is an invalid state for a dbuf. It is used by dbuf_free_range
86bb58aec7165f8a0303564575c65e5a2ad58bf1Alex Reece * to find all dbufs in a range of a dnode and must be less than any other
86bb58aec7165f8a0303564575c65e5a2ad58bf1Alex Reece * dbuf_states_t (see comment on dn_dbufs in dnode.h).
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef enum dbuf_states {
86bb58aec7165f8a0303564575c65e5a2ad58bf1Alex Reece DB_SEARCH = -1,
fa9e4066f08beec538e775443c5be79dd423fcabahrens DB_UNCACHED,
fa9e4066f08beec538e775443c5be79dd423fcabahrens DB_FILL,
82c9918f28a2d8d9e93769e16f7fa7bee347e80fTim Haley DB_NOFILL,
fa9e4066f08beec538e775443c5be79dd423fcabahrens DB_READ,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock DB_CACHED,
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock DB_EVICTING
fa9e4066f08beec538e775443c5be79dd423fcabahrens} dbuf_states_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstruct dnode;
fa9e4066f08beec538e775443c5be79dd423fcabahrensstruct dmu_tx;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * level = 0 means the user data
fa9e4066f08beec538e775443c5be79dd423fcabahrens * level = 1 means the single indirect block
fa9e4066f08beec538e775443c5be79dd423fcabahrens * etc.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybeestruct dmu_buf_impl;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybeetypedef enum override_states {
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee DR_NOT_OVERRIDDEN,
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee DR_IN_DMU_SYNC,
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee DR_OVERRIDDEN
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee} override_states_t;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybeetypedef struct dbuf_dirty_record {
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* link on our parents dirty list */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee list_node_t dr_dirty_node;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* transaction group this data will sync in */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee uint64_t dr_txg;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* zio of outstanding write IO */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee zio_t *dr_zio;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* pointer back to our dbuf */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee struct dmu_buf_impl *dr_dbuf;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* pointer to next dirty record */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee struct dbuf_dirty_record *dr_next;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* pointer to parent dirty record */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee struct dbuf_dirty_record *dr_parent;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens /* How much space was changed to dsl_pool_dirty_space() for this? */
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens unsigned int dr_accounted;
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens
11ceac77ea8034bf2fe9bdd6d314f5d1e5ceeba3Alex Reece /* A copy of the bp that points to us */
11ceac77ea8034bf2fe9bdd6d314f5d1e5ceeba3Alex Reece blkptr_t dr_bp_copy;
11ceac77ea8034bf2fe9bdd6d314f5d1e5ceeba3Alex Reece
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee union dirty_types {
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee struct dirty_indirect {
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* protect access to list */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee kmutex_t dr_mtx;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* Our list of dirty children */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee list_t dr_children;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee } di;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee struct dirty_leaf {
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /*
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee * dr_data is set when we dirty the buffer
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee * so that we can retain the pointer even if it
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee * gets COW'd in a subsequent transaction group.
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee arc_buf_t *dr_data;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee blkptr_t dr_overridden_by;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee override_states_t dr_override_state;
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick uint8_t dr_copies;
80901aea8e78a2c20751f61f01bebd1d5b5c2ba5George Wilson boolean_t dr_nopwrite;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee } dl;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee } dt;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee} dbuf_dirty_record_t;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct dmu_buf_impl {
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The following members are immutable, with the exception of
fa9e4066f08beec538e775443c5be79dd423fcabahrens * db.db_data, which is protected by db_mtx.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* the publicly visible structure */
fa9e4066f08beec538e775443c5be79dd423fcabahrens dmu_buf_t db;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* the objset we belong to */
503ad85c168c7992ccc310af845a581cff3c72b5Matthew Ahrens struct objset *db_objset;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson * handle to safely access the dnode we belong to (NULL when evicted)
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson struct dnode_handle *db_dnode_handle;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * our parent buffer; if the dnode points to us directly,
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson * db_parent == db_dnode_handle->dnh_dnode->dn_dbuf
fa9e4066f08beec538e775443c5be79dd423fcabahrens * only accessed by sync thread ???
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (NULL when evicted)
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson * May change from NULL to non-NULL under the protection of db_mtx
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson * (see dbuf_check_blkptr())
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct dmu_buf_impl *db_parent;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * link for hash table of all dmu_buf_impl_t's
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct dmu_buf_impl *db_hash_next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* our block number */
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t db_blkid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Pointer to the blkptr_t which points to us. May be NULL if we
fa9e4066f08beec538e775443c5be79dd423fcabahrens * don't have one yet. (NULL when evicted)
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens blkptr_t *db_blkptr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Our indirection level. Data buffers have db_level==0.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Indirect buffers which point to data buffers have
fa9e4066f08beec538e775443c5be79dd423fcabahrens * db_level==1. etc. Buffers which contain dnodes have
fa9e4066f08beec538e775443c5be79dd423fcabahrens * db_level==0, since the dnodes are stored in a file.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint8_t db_level;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* db_mtx protects the members below */
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmutex_t db_mtx;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Current state of the buffer
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens dbuf_states_t db_state;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Refcount accessed by dmu_buf_{hold,rele}.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If nonzero, the buffer can't be destroyed.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Protected by db_mtx.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens refcount_t db_holds;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* buffer holding our data */
fa9e4066f08beec538e775443c5be79dd423fcabahrens arc_buf_t *db_buf;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens kcondvar_t db_changed;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee dbuf_dirty_record_t *db_data_pending;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* pointer to most recent dirty record for this buffer */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee dbuf_dirty_record_t *db_last_dirty;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens /*
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee * Our link on the owner dnodes's dn_dbufs list.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Protected by its dn_dbufs_mtx.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
0f6d88aded0d165f5954688a9b13bac76c38da84Alex Reece avl_node_t db_link;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson /*
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * Link in dbuf_cache.
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson multilist_node_t db_cache_link;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* Data which is unique to data (leaf) blocks: */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
bc9014e6a81272073b9854d9f65dd59e18d18c35Justin Gibbs /* User callback information. */
bc9014e6a81272073b9854d9f65dd59e18d18c35Justin Gibbs dmu_buf_user_t *db_user;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs /*
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs * Evict user data as soon as the dirty and reference
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs * counts are equal.
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs */
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs uint8_t db_user_immediate_evict;
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs /*
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs * This block was freed while a read or write was
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs * active.
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee uint8_t db_freed_in_flight;
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs /*
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs * dnode_evict_dbufs() or dnode_evict_bonus() tried to
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs * evict this dbuf, but couldn't due to outstanding
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs * references. Evict once the refcount drops to 0.
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs */
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs uint8_t db_pending_evict;
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee uint8_t db_dirtycnt;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} dmu_buf_impl_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* Note: the dbuf hash table is exposed only for the mdb module */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define DBUF_MUTEXES 256
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define DBUF_HASH_MUTEX(h, idx) (&(h)->hash_mutexes[(idx) & (DBUF_MUTEXES-1)])
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct dbuf_hash_table {
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t hash_table_mask;
fa9e4066f08beec538e775443c5be79dd423fcabahrens dmu_buf_impl_t **hash_table;
fa9e4066f08beec538e775443c5be79dd423fcabahrens kmutex_t hash_mutexes[DBUF_MUTEXES];
fa9e4066f08beec538e775443c5be79dd423fcabahrens} dbuf_hash_table_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelieuint64_t dbuf_whichblock(struct dnode *di, int64_t level, uint64_t offset);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensdmu_buf_impl_t *dbuf_create_tlib(struct dnode *dn, char *data);
1934e92fc930c49429ad71a8ca97340f33227e78maybeevoid dbuf_create_bonus(struct dnode *dn);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumint dbuf_spill_set_blksz(dmu_buf_t *db, uint64_t blksz, dmu_tx_t *tx);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumvoid dbuf_spill_hold(struct dnode *dn, dmu_buf_impl_t **dbp, void *tag);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumvoid dbuf_rm_spill(struct dnode *dn, dmu_tx_t *tx);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockdmu_buf_impl_t *dbuf_hold(struct dnode *dn, uint64_t blkid, void *tag);
fa9e4066f08beec538e775443c5be79dd423fcabahrensdmu_buf_impl_t *dbuf_hold_level(struct dnode *dn, int level, uint64_t blkid,
fa9e4066f08beec538e775443c5be79dd423fcabahrens void *tag);
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelieint dbuf_hold_impl(struct dnode *dn, uint8_t level, uint64_t blkid,
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelie boolean_t fail_sparse, boolean_t fail_uncached,
fa9e4066f08beec538e775443c5be79dd423fcabahrens void *tag, dmu_buf_impl_t **dbp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelievoid dbuf_prefetch(struct dnode *dn, int64_t level, uint64_t blkid,
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelie zio_priority_t prio, arc_flags_t aflags);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid dbuf_add_ref(dmu_buf_impl_t *db, void *tag);
e57a022b8f718889ffa92adbde47a8f08abcdb25Justin T. Gibbsboolean_t dbuf_try_add_ref(dmu_buf_t *db, objset_t *os, uint64_t obj,
e57a022b8f718889ffa92adbde47a8f08abcdb25Justin T. Gibbs uint64_t blkid, void *tag);
fa9e4066f08beec538e775443c5be79dd423fcabahrensuint64_t dbuf_refcount(dmu_buf_impl_t *db);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockvoid dbuf_rele(dmu_buf_impl_t *db, void *tag);
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwickvoid dbuf_rele_and_unlock(dmu_buf_impl_t *db, void *tag);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
e57a022b8f718889ffa92adbde47a8f08abcdb25Justin T. Gibbsdmu_buf_impl_t *dbuf_find(struct objset *os, uint64_t object, uint8_t level,
e57a022b8f718889ffa92adbde47a8f08abcdb25Justin T. Gibbs uint64_t blkid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockint dbuf_read(dmu_buf_impl_t *db, zio_t *zio, uint32_t flags);
82c9918f28a2d8d9e93769e16f7fa7bee347e80fTim Haleyvoid dmu_buf_will_not_fill(dmu_buf_t *db, dmu_tx_t *tx);
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid dmu_buf_will_fill(dmu_buf_t *db, dmu_tx_t *tx);
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid dmu_buf_fill_done(dmu_buf_t *db, dmu_tx_t *tx);
2fdbea25c2ba89186b8a6b7c6840ebc9f4dff245Aleksandr Guzovskiyvoid dbuf_assign_arcbuf(dmu_buf_impl_t *db, arc_buf_t *buf, dmu_tx_t *tx);
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybeedbuf_dirty_record_t *dbuf_dirty(dmu_buf_impl_t *db, dmu_tx_t *tx);
c242f9a02a2ef021449275ae0a1d2581ee77231dchunli zhang - Sun Microsystems - Irvine United Statesarc_buf_t *dbuf_loan_arcbuf(dmu_buf_impl_t *db);
5d7b4d438c4a51eccc95e77a83a437b4d48380ebMatthew Ahrensvoid dmu_buf_write_embedded(dmu_buf_t *dbuf, void *data,
5d7b4d438c4a51eccc95e77a83a437b4d48380ebMatthew Ahrens bp_embedded_type_t etype, enum zio_compress comp,
5d7b4d438c4a51eccc95e77a83a437b4d48380ebMatthew Ahrens int uncompressed_size, int compressed_size, int byteorder, dmu_tx_t *tx);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsonvoid dbuf_destroy(dmu_buf_impl_t *db);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid dbuf_setdirty(dmu_buf_impl_t *db, dmu_tx_t *tx);
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybeevoid dbuf_unoverride(dbuf_dirty_record_t *dr);
46e1baa6cf6d5432f5fd231bb588df8f9570c858Matthew Ahrensvoid dbuf_sync_list(list_t *list, int level, dmu_tx_t *tx);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingvoid dbuf_release_bp(dmu_buf_impl_t *db);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
cdb0ab79ea1af7b8fc339a04d4bf7426dc77ec4emaybeevoid dbuf_free_range(struct dnode *dn, uint64_t start, uint64_t end,
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct dmu_tx *);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid dbuf_new_size(dmu_buf_impl_t *db, int size, dmu_tx_t *tx);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson#define DB_DNODE(_db) ((_db)->db_dnode_handle->dnh_dnode)
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson#define DB_DNODE_LOCK(_db) ((_db)->db_dnode_handle->dnh_zrlock)
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson#define DB_DNODE_ENTER(_db) (zrl_add(&DB_DNODE_LOCK(_db)))
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson#define DB_DNODE_EXIT(_db) (zrl_remove(&DB_DNODE_LOCK(_db)))
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson#define DB_DNODE_HELD(_db) (!zrl_is_zero(&DB_DNODE_LOCK(_db)))
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid dbuf_init(void);
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid dbuf_fini(void);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Ericksonboolean_t dbuf_is_metadata(dmu_buf_impl_t *db);
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson#define DBUF_GET_BUFC_TYPE(_db) \
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens (dbuf_is_metadata(_db) ? ARC_BUFC_METADATA : ARC_BUFC_DATA)
3baa08fc5b6bea08a475b0cfe3ad161d74c5864bek
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson#define DBUF_IS_CACHEABLE(_db) \
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson ((_db)->db_objset->os_primary_cache == ZFS_CACHE_ALL || \
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens (dbuf_is_metadata(_db) && \
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson ((_db)->db_objset->os_primary_cache == ZFS_CACHE_METADATA)))
3baa08fc5b6bea08a475b0cfe3ad161d74c5864bek
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson#define DBUF_IS_L2CACHEABLE(_db) \
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson ((_db)->db_objset->os_secondary_cache == ZFS_CACHE_ALL || \
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens (dbuf_is_metadata(_db) && \
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson ((_db)->db_objset->os_secondary_cache == ZFS_CACHE_METADATA)))
ad23a2db4cfc94c0ed1d58554479ce8d2e7e5768johansen
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef ZFS_DEBUG
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * There should be a ## between the string literal and fmt, to make it
fbabab8faf7439009737ccefe9d50152b38c26d1maybee * clear that we're joining two strings together, but gcc does not
fbabab8faf7439009737ccefe9d50152b38c26d1maybee * support that preprocessor token.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define dprintf_dbuf(dbuf, fmt, ...) do { \
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (zfs_flags & ZFS_DEBUG_DPRINTF) { \
fa9e4066f08beec538e775443c5be79dd423fcabahrens char __db_buf[32]; \
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t __db_obj = (dbuf)->db.db_object; \
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (__db_obj == DMU_META_DNODE_OBJECT) \
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strcpy(__db_buf, "mdn"); \
fa9e4066f08beec538e775443c5be79dd423fcabahrens else \
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) snprintf(__db_buf, sizeof (__db_buf), "%lld", \
fa9e4066f08beec538e775443c5be79dd423fcabahrens (u_longlong_t)__db_obj); \
fa9e4066f08beec538e775443c5be79dd423fcabahrens dprintf_ds((dbuf)->db_objset->os_dsl_dataset, \
fa9e4066f08beec538e775443c5be79dd423fcabahrens "obj=%s lvl=%u blkid=%lld " fmt, \
fa9e4066f08beec538e775443c5be79dd423fcabahrens __db_buf, (dbuf)->db_level, \
fa9e4066f08beec538e775443c5be79dd423fcabahrens (u_longlong_t)(dbuf)->db_blkid, __VA_ARGS__); \
fa9e4066f08beec538e775443c5be79dd423fcabahrens } \
fa9e4066f08beec538e775443c5be79dd423fcabahrens_NOTE(CONSTCOND) } while (0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define dprintf_dbuf_bp(db, bp, fmt, ...) do { \
fbabab8faf7439009737ccefe9d50152b38c26d1maybee if (zfs_flags & ZFS_DEBUG_DPRINTF) { \
c0a81264b59ba24de8701436570c3aae5689dc89ek char *__blkbuf = kmem_alloc(BP_SPRINTF_LEN, KM_SLEEP); \
43466aae47bfcd2ad9bf501faec8e75c08095e4fMax Grossman snprintf_blkptr(__blkbuf, BP_SPRINTF_LEN, bp); \
fa9e4066f08beec538e775443c5be79dd423fcabahrens dprintf_dbuf(db, fmt " %s\n", __VA_ARGS__, __blkbuf); \
c0a81264b59ba24de8701436570c3aae5689dc89ek kmem_free(__blkbuf, BP_SPRINTF_LEN); \
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson } \
fa9e4066f08beec538e775443c5be79dd423fcabahrens_NOTE(CONSTCOND) } while (0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
9c9dc39aa72ac40bb2558d54adfa596d217135d9ek#define DBUF_VERIFY(db) dbuf_verify(db)
9c9dc39aa72ac40bb2558d54adfa596d217135d9ek
fa9e4066f08beec538e775443c5be79dd423fcabahrens#else
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define dprintf_dbuf(db, fmt, ...)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define dprintf_dbuf_bp(db, bp, fmt, ...)
9c9dc39aa72ac40bb2558d54adfa596d217135d9ek#define DBUF_VERIFY(db)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef __cplusplus
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* _SYS_DBUF_H */