843e19887f64dde75055cf8842fc4db2171eff45johnlev * CDDL HEADER START
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The contents of this file are subject to the terms of the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Common Development and Distribution License (the "License").
843e19887f64dde75055cf8842fc4db2171eff45johnlev * You may not use this file except in compliance with the License.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
843e19887f64dde75055cf8842fc4db2171eff45johnlev * See the License for the specific language governing permissions
843e19887f64dde75055cf8842fc4db2171eff45johnlev * and limitations under the License.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * When distributing Covered Code, include this CDDL HEADER in each
843e19887f64dde75055cf8842fc4db2171eff45johnlev * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * If applicable, add the following below this CDDL HEADER, with the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * fields enclosed by brackets "[]" replaced with your own identifying
843e19887f64dde75055cf8842fc4db2171eff45johnlev * information: Portions Copyright [yyyy] [name of copyright owner]
843e19887f64dde75055cf8842fc4db2171eff45johnlev * CDDL HEADER END
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
613b28719c10e84c1202c1045df44d77767de21dRichard Bean * Copyright (c) 2012, 2016 by Delphix. All rights reserved.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern "C" {
843e19887f64dde75055cf8842fc4db2171eff45johnlev * dnode_hold() flags.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * dnode_next_offset() flags.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Fixed constants.
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define DNODE_CORE_SIZE 64 /* 64 bytes for dnode sans blkptrs */
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define DN_MAX_OBJECT_SHIFT 48 /* 256 trillion (zfs_fid_t limit) */
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define DN_MAX_OFFSET_SHIFT 64 /* 2^64 bytes in a dnode */
843e19887f64dde75055cf8842fc4db2171eff45johnlev * dnode id flags
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Note: a file will never ever have its
843e19887f64dde75055cf8842fc4db2171eff45johnlev * ids moved from bonus->spill
843e19887f64dde75055cf8842fc4db2171eff45johnlev * and only in a crypto environment would it be on spill
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Derived constants.
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define DN_MAX_NBLKPTR ((DNODE_SIZE - DNODE_CORE_SIZE) >> SPA_BLKPTRSHIFT)
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define DN_MAX_BONUSLEN (DNODE_SIZE - DNODE_CORE_SIZE - (1 << SPA_BLKPTRSHIFT))
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define DNODES_PER_BLOCK_SHIFT (DNODE_BLOCK_SHIFT - DNODE_SHIFT)
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define DNODES_PER_BLOCK (1ULL << DNODES_PER_BLOCK_SHIFT)
843e19887f64dde75055cf8842fc4db2171eff45johnlev * This is inaccurate if the indblkshift of the particular object is not the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * max. But it's only used by userland to calculate the zvol reservation.
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define DNODES_PER_LEVEL_SHIFT (DN_MAX_INDBLKSHIFT - SPA_BLKPTRSHIFT)
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define DNODES_PER_LEVEL (1ULL << DNODES_PER_LEVEL_SHIFT)
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* The +2 here is a cheesy way to round up */
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define DN_MAX_LEVELS (2 + ((DN_MAX_OFFSET_SHIFT - SPA_MINBLOCKSHIFT) / \
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define DN_USED_BYTES(dnp) (((dnp)->dn_flags & DNODE_FLAG_USED_BYTES) ? \
843e19887f64dde75055cf8842fc4db2171eff45johnlev (dnp)->dn_used : (dnp)->dn_used << SPA_MINBLOCKSHIFT)
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define EPB(blkshift, typeshift) (1 << (blkshift - typeshift))
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* Is dn_used in bytes? if not, it's in multiples of SPA_MINBLOCKSIZE */
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* Does dnode have a SA spill blkptr in bonus? */
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint8_t dn_indblkshift; /* ln2(indirect block size) */
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint8_t dn_bonustype; /* type of data in bonus buffer */
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint16_t dn_datablkszsec; /* data block size in 512b sectors */
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* accounting is protected by dn_dirty_mtx */
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t dn_maxblkid; /* largest allocated block ID */
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint64_t dn_used; /* bytes (or sectors) of disk space */
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint8_t dn_bonus[DN_MAX_BONUSLEN - sizeof (blkptr_t)];
193974072f41a843678abf5f61979c748687e66bSherry Moore * Protects the structure of the dnode, including the number of levels
843e19887f64dde75055cf8842fc4db2171eff45johnlev * of indirection (dn_nlevels), dn_maxblkid, and dn_next_*
613b28719c10e84c1202c1045df44d77767de21dRichard Bean /* Our link on dn_objset->os_dnodes list; protected by os_lock. */
843e19887f64dde75055cf8842fc4db2171eff45johnlev /* immutable: */
843e19887f64dde75055cf8842fc4db2171eff45johnlev dnode_phys_t *dn_phys; /* pointer into dn->dn_dbuf->db.db_data */
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Copies of stuff in dn_phys. They're valid in the open
843e19887f64dde75055cf8842fc4db2171eff45johnlev * context (eg. even before the dnode is first synced).
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Where necessary, these are protected by dn_struct_rwlock.
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint8_t dn_nblkptr; /* number of blkptrs (immutable) */
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint8_t dn_datablkshift; /* zero if blksz not power of 2! */
void dnode_init(void);
void dnode_fini(void);
#ifdef ZFS_DEBUG
#ifdef __cplusplus