fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
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 * CDDL HEADER END
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.
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern "C" {
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * define flags for dbuf_read
82c9918f28a2d8d9e93769e16f7fa7bee347e80fTim Haley * The simplified state transition diagram for dbufs looks like:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * +----> READ ----+
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * (alloc)-->UNCACHED CACHED-->EVICTING-->(free)
82c9918f28a2d8d9e93769e16f7fa7bee347e80fTim Haley * +----> FILL ----+ |
82c9918f28a2d8d9e93769e16f7fa7bee347e80fTim Haley * +--------> NOFILL -------+
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 * level = 0 means the user data
fa9e4066f08beec538e775443c5be79dd423fcabahrens * level = 1 means the single indirect block
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* link on our parents dirty list */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* transaction group this data will sync in */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* zio of outstanding write IO */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* pointer back to our dbuf */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* pointer to next dirty record */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* pointer to parent dirty record */
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens /* How much space was changed to dsl_pool_dirty_space() for this? */
11ceac77ea8034bf2fe9bdd6d314f5d1e5ceeba3Alex Reece /* A copy of the bp that points to us */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* protect access to list */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* Our list of dirty children */
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.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The following members are immutable, with the exception of
fa9e4066f08beec538e775443c5be79dd423fcabahrens * db.db_data, which is protected by db_mtx.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* the publicly visible structure */
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* the objset we belong to */
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson * handle to safely access the dnode we belong to (NULL when evicted)
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 * link for hash table of all dmu_buf_impl_t's
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* our block number */
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 * 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 /* db_mtx protects the members below */
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Current state of the buffer
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Refcount accessed by dmu_buf_{hold,rele}.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If nonzero, the buffer can't be destroyed.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Protected by db_mtx.
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* buffer holding our data */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* pointer to most recent dirty record for this buffer */
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee * Our link on the owner dnodes's dn_dbufs list.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Protected by its dn_dbufs_mtx.
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * Link in dbuf_cache.
c717a56157ae0e6fca6a1e3689ae1edc385716a3maybee /* Data which is unique to data (leaf) blocks: */
bc9014e6a81272073b9854d9f65dd59e18d18c35Justin Gibbs /* User callback information. */
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs * Evict user data as soon as the dirty and reference
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs * counts are equal.
d2058105c61ec61df3a2dd3f839fed8c3fe7bfd6Justin T. Gibbs * This block was freed while a read or write was
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.
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* Note: the dbuf hash table is exposed only for the mdb module */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define DBUF_HASH_MUTEX(h, idx) (&(h)->hash_mutexes[(idx) & (DBUF_MUTEXES-1)])
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelieuint64_t dbuf_whichblock(struct dnode *di, int64_t level, uint64_t offset);
fa9e4066f08beec538e775443c5be79dd423fcabahrensdmu_buf_impl_t *dbuf_create_tlib(struct dnode *dn, char *data);
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 Shellenbaumvoid dbuf_rm_spill(struct dnode *dn, dmu_tx_t *tx);
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,
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelieint dbuf_hold_impl(struct dnode *dn, uint8_t level, uint64_t blkid,
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelie boolean_t fail_sparse, boolean_t fail_uncached,
a2cdcdd260232b58202b11a9bfc0103c9449ed52Paul Dagnelievoid dbuf_prefetch(struct dnode *dn, int64_t level, uint64_t blkid,
e57a022b8f718889ffa92adbde47a8f08abcdb25Justin T. Gibbsboolean_t dbuf_try_add_ref(dmu_buf_t *db, objset_t *os, uint64_t obj,
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwickvoid dbuf_rele_and_unlock(dmu_buf_impl_t *db, void *tag);
e57a022b8f718889ffa92adbde47a8f08abcdb25Justin T. Gibbsdmu_buf_impl_t *dbuf_find(struct objset *os, uint64_t object, uint8_t level,
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);
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);
46e1baa6cf6d5432f5fd231bb588df8f9570c858Matthew Ahrensvoid dbuf_sync_list(list_t *list, int level, dmu_tx_t *tx);
cdb0ab79ea1af7b8fc339a04d4bf7426dc77ec4emaybeevoid dbuf_free_range(struct dnode *dn, uint64_t start, uint64_t end,
fa9e4066f08beec538e775443c5be79dd423fcabahrensvoid dbuf_new_size(dmu_buf_impl_t *db, int size, dmu_tx_t *tx);
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)))
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens (dbuf_is_metadata(_db) ? ARC_BUFC_METADATA : ARC_BUFC_DATA)
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson ((_db)->db_objset->os_primary_cache == ZFS_CACHE_ALL || \
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson ((_db)->db_objset->os_primary_cache == ZFS_CACHE_METADATA)))
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson ((_db)->db_objset->os_secondary_cache == ZFS_CACHE_ALL || \
744947dc83c634d985ed3ad79ac9c5e28d1865fdTom Erickson ((_db)->db_objset->os_secondary_cache == ZFS_CACHE_METADATA)))
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 (void) snprintf(__db_buf, sizeof (__db_buf), "%lld", \
43466aae47bfcd2ad9bf501faec8e75c08095e4fMax Grossman snprintf_blkptr(__blkbuf, BP_SPRINTF_LEN, bp); \
fa9e4066f08beec538e775443c5be79dd423fcabahrens dprintf_dbuf(db, fmt " %s\n", __VA_ARGS__, __blkbuf); \
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* _SYS_DBUF_H */